Выбор формы с учётом производительности

Основы коллизионных форм

В Cannon.js каждая физическая сущность (Body) связывается с одной или несколькими CollisionShape (формами столкновения). Основные типы форм включают:

  • Box — прямоугольный параллелепипед, задаётся векторами половинных размеров (halfExtents).
  • Sphere — сфера, задаётся радиусом (radius).
  • Cylinder — цилиндр, задаётся радиусами основания, высотой и количеством сегментов.
  • ConvexPolyhedron — выпуклый многоугольник с произвольной формой.
  • Trimesh — произвольная трёхмерная сетка, обычно импортируемая из моделей.
  • Heightfield — для рельефа, задаётся массивом высот.

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


Сравнение производительности форм

  1. Sphere (Сфера)

    • Наиболее эффективная форма.
    • Расчёт столкновений сводится к вычислению расстояния между центрами двух сфер.
    • Подходит для объектов, где точная форма не критична (например, мячи, снаряды, персонажи с упрощённой физикой).
  2. Box (Прямоугольный параллелепипед)

    • Быстро вычисляется с использованием осей-ориентированных ограничивающих рамок (AABB).
    • Хорошо подходит для мебели, стен, платформ.
    • Легко комбинируется с другими формами для создания сложных тел.
  3. Cylinder (Цилиндр)

    • Чуть сложнее, чем сфера или коробка, особенно при расчёте вращения и наклонов.
    • Используется для бочек, колонн, объектов с круглым сечением.
  4. ConvexPolyhedron (Выпуклый многоугольник)

    • Высокая точность, но стоимость вычислений растёт с количеством вершин.
    • Эффективно использовать для ограниченного числа вершин, иначе производительность падает.
  5. Trimesh (Трёхмерная сетка)

    • Наиболее точная форма для сложных моделей.
    • Очень тяжёлая для вычислений: пересечения проверяются для каждой грани.
    • Рекомендуется только для статичных объектов (mass = 0) или если количество таких тел минимально.
  6. Heightfield (Рельеф)

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

Практические рекомендации по выбору формы

  • Сочетание точности и скорости: использовать простые формы (сфера, коробка, цилиндр) для большинства динамических тел, а сложные (ConvexPolyhedron, Trimesh) — только там, где точность критична.
  • Комбинированные формы: Cannon.js поддерживает добавление нескольких форм к одному телу (body.addShape(shape, offset, orientation)). Это позволяет моделировать сложные объекты без применения тяжёлых Trimesh.
  • Статичные объекты: для объектов с mass = 0 допустимо использовать Trimesh или Heightfield, так как они не участвуют в динамических столкновениях с другими сложными телами.
  • Минимизация вершин: при работе с ConvexPolyhedron уменьшение числа вершин напрямую ускоряет расчёт столкновений.
  • Использование сфер и коробок для коллизий персонажей: упрощённая коллизия часто оказывается достаточно реалистичной и экономит ресурсы.

Настройка параметров для производительности

  • fixedRotation — отключает расчёт вращения для тел, где оно не требуется. Ускоряет обработку столкновений.
  • sleeping — позволяет телам «засыпать», если они не двигаются, снижая нагрузку на симуляцию.
  • collisionFilterGroup и collisionFilterMask — ограничения на то, с какими группами тел проверяются столкновения, экономят лишние вычисления.
  • Смешение динамических и статических тел: статические объекты (массой 0) обрабатываются быстрее, чем динамические, поэтому сцены лучше структурировать так, чтобы сложные формы были статичными.

Оптимизация столкновений в сложных сценах

  1. Использовать AABB или Bounding Sphere для предварительной фильтрации тел перед проверкой точных столкновений.
  2. Дробить большие модели на составные тела с простыми формами, чтобы заменить одну тяжелую Trimesh на набор Box и Sphere.
  3. Избегать глубокой вложенности динамических Trimesh: несколько динамических сложных тел сразу создают резкий рост вычислительной нагрузки.
  4. Баланс между количеством тел и детализацией форм: лучше иметь больше простых тел, чем несколько очень сложных.

Заключение по форме и производительности

Выбор формы в Cannon.js напрямую влияет на эффективность симуляции. Сферы и коробки обеспечивают максимальную производительность, цилиндры и ConvexPolyhedron подходят для умеренной точности, а Trimesh — только для статичных или редких объектов. Оптимальное сочетание форм, комбинирование простых коллизионных тел и использование параметров симуляции позволяют создавать реалистичные сцены без чрезмерной нагрузки на CPU.