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

Одной из частых задач при построении сцены в 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 Комментарий
Новые
Старые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии