Three.js алгоритм выбора выделения в 3D сцене - PullRequest
0 голосов
/ 11 января 2019

Я создаю приложение для редактирования 3D-моделей, используя THREE.js, где вы можете загрузить CAD-модель и отобразить ее на экране. Вы можете перемещать, масштабировать, поворачивать камеру в любом месте сцены, чтобы увидеть модель САПР под любым углом.

Я хочу добавить поддержку, чтобы можно было рисовать произвольный прямоугольник на экране (поле выделения) и все, что внутри этого поля, я бы хотел выбрать.

Какой хороший алгоритм использовать для этой операции?

Моей первой мыслью было взять каждую загруженную деталь САПР (которую можно выбрать) и спроецировать ее ограничивающую рамку на экран. Затем проверьте каждое из этих проецируемых ограничительных рамок на поле выбора, нарисованное на экране для совпадений. Это должно сработать, однако я боюсь, что это будет очень медленно для больших моделей САПР с тысячами выбираемых деталей.

Есть ли лучший способ сделать выделение в 3D? Можно ли каким-то образом использовать радиовещание для ускорения выборов?

1 Ответ

0 голосов
/ 11 января 2019

Не зная более подробной информации о ваших моделях CAD, будет довольно сложно дать именно соответствующие предложения, но я могу предложить несколько вещей, которые я мог бы попробовать.

Использовать иерархические ограничивающие рамки

Если у вас многоуровневое дерево ячеек, вы можете создать ограничивающие рамки для неконечных узлов дерева. Это не поддерживается напрямую в THREE, но вы можете вручную создать эти объекты и проверить их, прежде чем проверять, находятся ли дочерние объекты в выделенной области.

Если ваше дерево не очень хорошо организовано в пространстве или очень плоское, тогда вы можете построить дерево октав и пересечь узлы дерева окт, прежде чем проверять сетки.

Конечно, эти структуры данных должны обновляться всякий раз, когда сетки перемещаются в вашей модели САПР.

Границы мира кэша

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

Асинхронная проверка

Вместо того, чтобы собирать все пересекаемые границы в одном кадре, вы можете собрать их в несколько кадров, если это занимает много времени.

К сожалению, я не думаю, что радиовещание может многое сделать для вас здесь.

Надеюсь, это поможет!

...