Влияние типа геометрии на скорость узкой фазы

Библиотека Oimo.js является физическим движком для JavaScript, ориентированным на симуляцию твердых тел с использованием упрощенной физики. В ядре движка лежит расчет столкновений и интеграция движения тел. Одним из ключевых факторов, влияющих на производительность симуляции, является тип геометрии тел, участвующих в узкой фазе столкновений.

В Oimo.js геометрические формы разделяются на базовые типы:

  • Box – прямоугольный параллелепипед.
  • Sphere – сфера.
  • Cylinder – цилиндр.
  • Capsule – капсула (две сферы, соединенные цилиндром).
  • ConvexMesh – выпуклая меш-геометрия.

Каждый тип геометрии имеет различную сложность для алгоритмов столкновений. Алгоритмы узкой фазы (narrow-phase collision detection) выполняют точное определение пересечения после грубой фильтрации (broad-phase).


Влияние геометрии на узкую фазу

Box

Box является наиболее простым и оптимизированным типом для узкой фазы. Столкновения двух параллелепипедов обрабатываются с использованием алгоритма Separating Axis Theorem (SAT), который проверяет проекции граней на потенциальные оси разделения. Преимущества:

  • Предсказуемая производительность.
  • Простота интеграции с другими Box-объектами.

Недостатки:

  • Для пересечений с другими формами (сфера, капсула) требуется больше вычислений, чем при столкновении двух сфер.

Sphere

Сферы обеспечивают максимальную скорость в узкой фазе благодаря своей симметрии. Столкновение сводится к проверке расстояния между центрами, что требует минимального количества операций. Преимущества:

  • Очень быстрые расчеты для любых столкновений.
  • Простая физическая интеграция.

Недостатки:

  • Ограниченные возможности для сложных форм.
  • Не подходит для точного моделирования прямоугольных объектов.

Cylinder и Capsule

Цилиндры и капсулы требуют более сложных вычислений:

  • Для цилиндров необходимо учитывать направление оси, что увеличивает количество операций при проекциях.
  • Для капсул используется сочетание сфер и цилиндров, что делает алгоритм сложнее, чем для простых сфер или коробок.

Эти формы оптимальны для персонажей или объектов с вытянутой формой, где точность сфер и коробок недостаточна.

ConvexMesh

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

  • Необходимо проверять пересечения граней, рёбер и вершин.
  • Алгоритм SAT работает с множеством осей, что увеличивает вычислительную нагрузку.
  • Каждое столкновение может включать десятки или сотни проверок, особенно при сложной сетке.

Использование ConvexMesh оправдано только при необходимости точного моделирования сложных форм.


Практические аспекты оптимизации

  1. Сокращение количества сложных тел Чем больше объектов с ConvexMesh в сцене, тем больше нагрузка на узкую фазу. Замена на Box или Sphere значительно ускоряет расчеты.

  2. Комбинированные коллайдеры Для сложных объектов часто используют комбинацию Box, Sphere и Capsule, избегая ConvexMesh, что снижает количество проверок пересечения.

  3. Предварительная фильтрация в Broad Phase Упрощение геометрии на этапе грубой фильтрации уменьшает количество столкновений, которые нужно проверять в узкой фазе.

  4. Использование размеров и ориентации Для Box и Cylinder ориентация влияет на количество проверяемых осей. Правильная установка осей объектов может уменьшить количество операций SAT.

  5. Баланс точности и производительности Сферы и капсулы лучше всего подходят для динамических объектов, где важна скорость. Box подходит для статических препятствий. ConvexMesh используют для ключевых объектов с высокой визуальной точностью.


Метрики производительности

  • Количество операций в узкой фазе зависит от количества граней, рёбер и вершин.
  • Время на столкновение для двух сфер ≈ 1–2 операций.
  • Время для Box-Box зависит от количества осей (до 15 проверок).
  • ConvexMesh может потребовать сотни операций, что сильно замедляет симуляцию при большом количестве объектов.

Вывод по типам геометрии

  • Сферы – минимальная нагрузка, высокая скорость, низкая точность для сложных форм.
  • Box – оптимальный компромисс между точностью и скоростью для большинства статических объектов.
  • Cylinder / Capsule – средняя нагрузка, подходят для персонажей или длинных объектов.
  • ConvexMesh – высокая нагрузка, используют только при необходимости визуальной точности и сложной формы.

Эффективная работа узкой фазы напрямую зависит от правильного выбора типов геометрии и их количества, а также от грамотной комбинации базовых форм для оптимизации производительности симуляции в Oimo.js.