В Oimo.js производительность симуляции физики сильно зависит от
выбора форм (shapes) для тел (bodies). Библиотека оптимизирована под
определённые типы примитивов, и правильный выбор формы позволяет
уменьшить вычислительную нагрузку и повысить стабильность симуляции.
Примитивы и их
влияние на производительность
Oimo.js поддерживает несколько основных примитивов:
- Box – куб или прямоугольный параллелепипед.
- Sphere – сфера.
- Cylinder – цилиндр.
- Capsule – капсула (цилиндр с полусферами на
концах).
- Convex Mesh – произвольная выпуклая форма.
- Triangle Mesh – произвольная треугольная сетка для
статических объектов.
Ключевой принцип: чем проще форма, тем быстрее
расчёты столкновений. Box и Sphere обеспечивают максимальную
производительность, Cylinder и Capsule чуть медленнее, а Convex Mesh и
Triangle Mesh значительно более ресурсоёмкие.
Box и Sphere
- Box – идеален для большинства объектов сцены.
Проверка пересечения прямоугольников выполняется быстро, что особенно
важно при большом количестве динамических тел.
- Sphere – отлично подходит для шаровых объектов и
объектов с гладкой геометрией. Столкновения с шарами вычисляются
минимально затратно.
Рекомендации по использованию:
- Для объектов с прямыми краями всегда использовать Box, даже если
модель визуально немного отличается.
- Для сферических объектов или роликов, мячей и пуль – Sphere.
Cylinder и Capsule
- Cylinder и Capsule имеют более сложные алгоритмы расчёта
столкновений, чем Box и Sphere, из-за кривизны боковых
поверхностей.
- Capsule особенно удобна для персонажей и объектов, которые должны
скользить по поверхностям без застреваний.
Рекомендации:
- Использовать Cylinder и Capsule только там, где их форма критична
для точности физики.
- Для экономии ресурсов заменить Capsule на комбинацию Box + Sphere,
если высокая точность не требуется.
Convex Mesh
- Convex Mesh позволяет создавать сложные объёмы, но проверка
столкновений с ними требует расчёта всех граней и рёбер.
- Вычислительная нагрузка растёт с числом вершин и граней.
Оптимизация:
- Уменьшать количество вершин до минимально необходимого.
- Использовать Convex Mesh только для крупных объектов или объектов,
которые редко взаимодействуют с другими динамическими телами.
Triangle Mesh
- Triangle Mesh используется для статических сцен, например, для
земли, стен и зданий.
- Полностью динамическая Triangle Mesh крайне ресурсоёмкая и не
рекомендуется.
Советы по производительности:
- Делить сцену на несколько простых треугольных мешей вместо одной
сложной.
- Использовать Triangle Mesh только для статических объектов (тип
static).
Общие рекомендации
- Минимизировать количество сложных форм. Каждое
Convex или Triangle Mesh тело замедляет симуляцию.
- Комбинировать простые примитивы. Сложные объёмы
можно приближённо моделировать с помощью нескольких Box и Sphere.
- Использовать LOD (Level of Detail). Для объектов,
находящихся далеко от камеры, можно заменить сложные формы на
простые.
- Статические объекты делать статичными. Triangle
Mesh и Convex Mesh для статических тел не требуют пересчёта столкновений
динамически.
- Собирать физику вокруг центров масс. Примитивы с
корректным расположением центра массы обеспечивают более стабильные
расчёты.
Параметры тела,
влияющие на производительность
- mass – масса тела влияет на расчёт динамики, но не
на проверку столкновений.
- friction и restitution – коэффициенты трения и
упругости незначительно увеличивают вычислительную нагрузку.
- sleeping – включение автоматического “засыпания”
объектов уменьшает число расчётов для неподвижных тел.
Практическая стратегия
выбора форм
- Малые динамические объекты: Sphere или Box.
- Средние и крупные динамические объекты: Box с
возможной комбинацией Sphere/Capsule для сложных краёв.
- Статические элементы сцены: Triangle Mesh или
Convex Mesh, статичные, с низким количеством вершин.
- Персонажи и скользящие объекты: Capsule с
минимально необходимой детализацией.
Использование этих принципов позволяет поддерживать высокую
производительность при работе с Oimo.js, сокращает нагрузку на процессор
и увеличивает стабильность симуляции при большом числе объектов.