Как Tangl определяет коллизии и что в итоге получается?
Как Tangl определяет коллизии и что в итоге получается?
Ядро расчета коллизий Tangl обеспечивает эффективное выявление наличия пересечений (коллизий) между объектами в 3D-модели.
Основная задача поиска коллизий заключается в определении существования пар объектов, которые пересекаются или находятся на расстоянии друг от друга менее определенного порогового значения (отступа).
Если такие пары обнаружены, это указывает на потенциальные проблемы, которые могут потребовать корректировки или исправления в проекте или модели.
Как видит геометрию нативное ПО?
Обычно, если вы создаете модель в каком-либо профильном ПО, то она описывается различными параметрическими алгоритмами и фигурами, которые они описывают (кубы, сферы, выдавливания и т. д.), а также их сочетаниями.
Такая геометрия легко редактируется, по ней легко вычислять объемы, площади, пересечения и т. д. Однако такая геометрия обычно существует только в ПО, которое еще создает и редактирует.
Как видит геометрию Tangl?
Трехмерная модель, которая приходит в Tangl (в которой мы и ищем коллизии), уже представлена в виде сеток треугольников. Каждый объект модели состоит из множества таких треугольников. В этом случае такая геометрия в модели называется триангулированной геометрией.
Треугольники можно назвать самыми основными и простыми элементами трехмерных моделей. Они очень эффективно обрабатываются вашей видеокартой. На самом деле ваша видеокарта только их и понимает, в отличие от всех других видов геометрии.
Поэтому любая геометрия, попадающая в Tangl (равно как и в другое ПО для работы с моделями, например, в Navisworks), становится триангулированной.
Все так хорошо? А где подвох?
На самом деле их несколько. Во-первых, разное ПО может по-разному триангулировать сложную геометрию, в которой много криволинейных поверхностей. Это означает, что итоговая геометрия де-факто уже не совсем такая, какая была в исходном ПО.
А во-вторых, анализ пересечений для триангулированной геометрии — математически нетривиальная задача, которая не решается «в лоб». Нельзя просто так взять и определить факт и степень пересечения одного триангулированного объема с другим.
Как же быть?
Tangl фокусируется на многоступенчатом анализе производных от такой геометрии, а также на анализе отдельных треугольников и их групп.
Далее результаты отдельных итераций совмещаются, и определяется итоговый факт пересечения, а также его «расстояние», которого мы коснемся чуть позже.
Также на состав этих этапов и результаты проверки влияет и режим проверки: "По пересечению" или "По объему".
Так, из-за того, что в режиме «По пересечению» центральными составными элементом являются треугольники, коллизия не будет найдена, если отсутствует явное пересечение или сближение этих треугольников.
Напротив, в режиме "По объему" Tangl строит более сложные системы производных от триангулированной геометрии и использует дополнительные этапы в анализе геометрии.
Это дает возможность определять коллизии между объектами, один из которых может находиться внутри другого (вложенные).
Данный метод обычно более медленный, чем метод "По пересечению", а результаты определения расстояния пересечения могут отличаться.
А что означает "расстояние пересечения"?
В отчете по коллизиям есть параметр "расстояние".
Может показаться, что он означает расстояние, на которое объем одного элемента «зашел» в объем другого. Но это не так!
Как мы уже писали выше, работа с триангулированной геометрией как с физическими объемами математически нетривиальна.
А значит, и вычисление расстояния, на которое один объем «вошел» в другой, тоже не является тривиальным, так как никаких объемов, по сути, не существует. Есть только совокупности треугольников.
Возьмем очень простой, но показательный пример. Два пересекающихся шара. С одной стороны это очень простые объекты, а с другой они имеют криволинейные поверхности с множеством мелких треугольников.
В нашем примере две сферы "входят" друг в друга на расстояние 3 метра:
После переноса в Tangl мы получили триангулированную геомметрию. Замер примерно по экватору показывает пересечение ~2.995 метра:
Однако, если мы проведем анализ на коллизии "По пересечению", то в отчете увидим совсем другое число: **0.209 метра. **
А если "По объему", то увидим расстояние в 2.897 метра, что уже сильно ближе к реальному значению, но немного меньше:
Так что же это за величина?
Все зависит от типа проверки.
В режиме "По пересечению" Tangl обнаруживает пересечение треугольников. Он вычисляет величину пересечения двух конкретных треугольников. Затем он проверяет полученные значения величин (так как обычно в пределах двух объектов пересечения есть в разных треугольниках) и находит максимальное из них.
Иначе говоря, рассчитываются расстояния пересечения не самих сфер, а пересечение треугольников, из которых эти сферы состоят.
В режиме "По объему" Tangl оперирует уже не отдельными треугольниками, а производными от групп треугольников, которые могут составлять объем или его часть.
Иначе говоря, рассчитываются расстояния пересечения не самих сфер, а предполагаемых простых объемов, которые Tangl пытается реконструировать из групп треугольников.
При этом из каждого объекта может получиться много предполагаемых простых объемов, а не один, особенно если геометрия объекта сложная, с выступами, загибами и отверстиями, как на кортинке ниже:
Поэтому даже расстояние пересечения "По объему" может сильно отличаться от фактических измерений.
В любом из режимов при проверке с отрицательным отступом (проверка на сближение) Tangl сначала проверяет, явные пересечения объектов. Если они пересекаются, возвращается расстояние между ними, но уже со знаком минус.
Если объекты не пересекаются, Tangl находит расстояние между ближайшими треугольниками или простыми объемами в зависимости от типа проверки.
А вот в Navisworks не так!
На самом деле очень даже так! Причем во всем.
В абсолютном большинстве случаев результаты обнаружения коллизий в Tangl соответствуют результатам, полученным в Navisworks, причем это касается, как самого факта пересечений, так и определяемых расстояний пересечений.
Вот наш пример с двумя сферами в Navisworks показал расстояние в 0.211 метров, которое очень похоже на расстояние в Tangl: 0.209 метров:
При использовании режима "По пересечения (консервативно)", который аналогичен режиму "По объему" в Tangl мы получаем также очень схожий результат: 2.996 метров (в Tangl расстояние было 2.897 метров):
Эти небольшие различия связаны с предварительной обработкой модели в Navisworks, в частности, с триангуляцией кривых и поверхностей.
Надеемся, что теперь у вас сложилось понимание, как на самом деле работают коллизии в Tangl и Navisworks и почему они дают такие результаты, которые вы видите в отчетах.