Поиск пересечений

Одной из частых задач при построении сцены в Blender является контроль пересечения мешей. Определить пересекаются ли два меша между собой можно, используя технологию ограничивающих объемов (Bounding Volume).

Модуль “mathutils” предоставляет нам возможность легко и просто построить деревья иерархии ограничивающих объемов Bounding Volume Hierarchy Tree (BVH-Tree) для любых мешей в сцене, и с их помощью проводить проверку на пересечения.

Для примера добавим в сцену UV-Сферу (shift + a – Mesh – UV Sphere) и плоскость (shift + a – Mesh – Plane). Для плоскости добавим подразделений (Subdivide) в режиме редактирования.

Для того, чтобы BVH-деревья можно было корректно проверить на пересечения, меши, по которым они строятся, должны находиться в одной системе координат.

Вычислим точки обоих мешей (плоскости и сферы) в единой системе координат – мировой. Для этого умножим координаты каждой точки меша на его матрицу мира.

Также мы получили списки полигонов меша с относящимися к ним вертексами.

Имея эти два списка (координат точек и соотношений точек с полигонами), мы можем построить для каждого меша дерево ограничивающих объемов BVH-Tree:

Для двух BVH-деревьев можно легко найти пересечения:

Метод “overlap” возвращает список индексов пересекающихся полигонов в виде пар:

(“индекс полигона меша 1”, “индекс полигона меша 2”).

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

Для более детальной проверки пересечений, разберем полученный список на два отдельных списка, каждый из которых относится к своему мешу:

Теперь мы можем выделить на каждом меше полигоны, имеющие пересечения (в объектном режиме).

0 0 голоса
Article Rating
Подписаться
Уведомить о
guest
0 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии