Операции с препятствиями
Вне зависимости от режима обработки препятствий процедура обработки состоит из нескольких этапов:
- Сбор информации о геометрии препятствия для каждого Nav3DObstacle.
На данном этапе происходит получение списка всех геометрий, образующих препятствие, затем происходит их объединение (кластеризация).
Положим, в transform иерархии препятствия есть несколько дочерних элементов, у каждого из которых есть MeshFilter с назначенным Mesh. Соответственно, в таком случае будет получено несколько списков треугольников, из которых состоят меши. Далее для каждого списка треугольников будет определен охватывающий объем в виде Bounds. Те списки, чьи Bounds пересекаются, будут объединены. Будем называть каждый такой отдельный список “объемом препятствия”. В результате получается один или несколько объемов препятствий. Это будет проделано для каждого обрабатываемого Nav3DObstacle на сцене.
- Кластеризация с уже обработанными препятствиями.
Проверяется, пересекает(-ют) ли объемы добавляемого препятствия с объемами уже находящихся в хранилище препятствий. Если да, то происходит кластеризация с уже добавленными препятствиями. В результате получается новый список объемов препятствий.
- Удаление из хранилища неактуальных объемов хранимых препятствий
Не актуальными считаются те объемы, которые пересеклись с объемами вновь добавляемого препятствия, и которые вошли с состав новых (кластеризованных) объемов.
- Далее происходит построение графов проходимости для новых объемов, затем эти объемы (вместе с графом внутри) добавляются в хранилище препятствий. navigation graphs are constructed for new volumes.
These volumes are then added to the obstacle storage.
Удаление препятствия из хранилища состоит из следующих этапов:
- Из хранилища получается список всех объемов, содержащих треугольники удаляемого препятствия (в каждом объеме могут быть треугольники нескольких препятствий).
- Для каждого объема из полученного списка происходит удаление треугольников удаляемого препятствия.
- Далее рассматриваются только объемы, в которых после изъятия еще остались треугольники. Для этих объемов пересчитываются ограничивающие Bounds.
- Все объемы из первоначального списка удаляются из хранилища препятствий.
- Все оставленные объемы с пересчитанными Bounds кластеризуются и вновь добавляются в хранилище препятствий.