Arhn - архитектура программирования

Как определить, находится ли точка внутри коробки (three.js)?

Если у нас есть блок, не выровненный по осям, как нам лучше всего проверить, находится ли точка внутри него? (Я использую three.js, поэтому любая утилита оттуда может помочь. Three.js содержит концепцию ограничивающей рамки, но это ограничивающая рамка, выровненная по оси)


  • Как ваш ящик, не выровненный по оси, помещается в невыровненный? Вы используете преобразование или это геометрия, которая явно позиционируется в такой ориентации? 20.09.2017
  • Подходов много. Что лучше - зависит от того, как определяется этот ящик. 20.09.2017
  • @ TheJim01 Я создаю коробку, перевожу ее и поворачиваю. 20.09.2017

Ответы:


1

Если ваш блок представляет собой THREE.BoxGeometry, который вращается, перемещается и масштабируется, вы можете использовать его матрицу преобразования m, чтобы определить, пересекает ли он вашу точку v:

  • преобразовать v и коробку обратным m
  • проверьте, находится ли преобразованный v внутри преобразованного блока (который теперь выровнен по оси)

Вот код:

var box = <Your non-aligned box>
var point = <Your point>

box.geometry.computeBoundingBox(); // This is only necessary if not allready computed
box.updateMatrixWorld(true); // This might be necessary if box is moved

var boxMatrixInverse = new THREE.Matrix4().getInverse(box.matrixWorld);

var inverseBox = box.clone();
var inversePoint = point.clone();

inverseBox.applyMatrix(boxMatrixInverse);
inversePoint.applyMatrix4(boxMatrixInverse);

var bb = new THREE.Box3().setFromObject(inverseBox);

var isInside = bb.containsPoint(inversePoint);

А вот и работающая демонстрация: https://jsfiddle.net/holgerl/q0z979uy/

20.09.2017
  • Это была моя первая идея. Если это лучший подход, они должны сделать служебный метод в three.js, который делает это. 20.09.2017
  • @croraf Я изменил свой ответ на более общий подход и добавил код, который делает это сейчас. Это работает для вас? 20.09.2017
  • @HolgerL Вы без необходимости создаете 240 объектов в секунду. 20.09.2017
  • @WestLangley calculateBoundingBox не нужен, и если блок не движется: getInverse, box.clone(), inverseBox.applyMatrix и Box3().setFromObject можно извлечь из цикла анимации? 20.09.2017
  • Ну и что, @WestLangley. Смысл моего ответа в том, чтобы объяснить, как решается проблема. Оптимизированный код обычно труднее читать и понимать. Вопрос заключался в том, как решить эту проблему, а не в том, как написать оптимизированный по производительности код. И демонстрация должна показать, что это работает. Когда я помогаю людям, я предпочитаю удобочитаемость объему памяти. 20.09.2017
  • Если я поставлю эти экземпляры непосредственно перед входом в цикл анимации (конец этапа настройки), я не получу правильный результат. Как ни странно, в этот момент box.matrixWorld является единичной матрицей, а не правильной матрицей преобразования ящика. Любые объяснения? 21.09.2017
  • @HolgerL, возможно, вы могли бы написать более готовый к производству пример и выделить важные строки или даже просто написать объяснение в комментарии? Это сводится к преобразованию точки с обратной. 21.09.2017
  • @pailhead Ответ и так в порядке, пока я беспокоюсь. А также готово к производству, если коробка движется. Мне просто интересно, почему матрица идентичности box.matrixWorld, если я проверяю перед анимацией? 21.09.2017
  • Я решил проблему с тем, что box.matrixWorld не установлен, с помощью: box.updateMatrixWorld(true); Поэтому в ответ я бы просто изменил строку box.geometry.computeBoundingBox(); с этой строкой. 21.09.2017
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..