Архитектура Shape и привязка к телу

Cannon.js — это физический движок для JavaScript, предназначенный для симуляции динамики твердых тел. Центральным элементом его архитектуры является объект Shape, который определяет форму физического тела и его свойства при столкновениях. Понимание структуры Shape и механизма привязки к телу (Body) является ключевым для создания сложных физических сцен.


Основные концепции Shape

В Cannon.js Shape представляет собой геометрическую форму, которая участвует в расчетах столкновений. Все формы наследуются от базового класса CANNON.Shape. Существует несколько встроенных типов форм:

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

Каждая форма имеет свойства, влияющие на физику:

  • boundingSphereRadius — радиус ограничивающей сферы, используемой для оптимизации столкновений.
  • volume — объем формы, вычисляемый автоматически для базовых форм.
  • updateBoundingSphereRadius() — метод для пересчета радиуса после изменения размеров формы.

Привязка формы к телу

Физическое тело (CANNON.Body) представляет собой объект с массой, положением и ориентацией. Тело может содержать одну или несколько форм. Привязка формы к телу осуществляется через массив shapes и соответствующие смещения shapeOffsets и ориентации shapeOrientations.

const shape = new CANNON.Box(new CANNON.Vec3(1, 2, 0.5));
const body = new CANNON.Body({ mass: 5 });
body.addShape(shape, new CANNON.Vec3(0, 1, 0), new CANNON.Quaternion(0, 0, 0, 1));
  • addShape(shape, offset, orientation) — добавляет форму к телу.

    • offset задает позицию формы относительно центра масс тела.
    • orientation определяет локальную ориентацию формы.

Использование смещений позволяет строить сложные объекты из нескольких форм, например, моделировать автомобиль с отдельными кузовом и колесами.


Взаимодействие формы с телом

Форма не существует отдельно от тела. Основные механизмы взаимодействия:

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

  2. Инерционные свойства Body автоматически пересчитывает инерционные тензоры на основе добавленных форм. Если форма имеет смещение, инерционный тензор корректируется с учетом положения формы.

  3. Коллизии и контакты Cannon.js использует форму для вычисления столкновений. Для каждой формы рассчитывается контакт с другими телами, учитывая смещение и ориентацию.

  4. Множественные формы Массив shapes позволяет комбинировать формы. Cannon.js последовательно проверяет столкновения для всех форм, входящих в тело. Для сложных моделей это позволяет экономить ресурсы, заменяя одну точную сетку на несколько простых форм.


Управление формами

С Cannon.js можно динамически изменять состав тела:

  • Удаление формы:

    body.removeShape(shape);

    После удаления форма больше не участвует в расчетах столкновений. Интересно, что центр масс пересчитывается автоматически, если был изменен состав форм.

  • Перемещение формы: Изменение смещения формы требует пересчета инерционного тензора:

    body.shapeOffsets[index].set(newX, newY, newZ);
    body.updateMassProperties();
  • Изменение ориентации формы:

    body.shapeOrientations[index].setFromEuler(alpha, beta, gamma, "XYZ");
    body.updateMassProperties();

Оптимизация при использовании Shape

  • Bounding sphere: всегда актуально пересчитывать после масштабирования или трансформации формы, чтобы ускорить проверку столкновений.
  • Простые формы: предпочтение стоит отдавать базовым геометрическим объектам (Box, Sphere), особенно для динамических тел.
  • Сложные формы: Trimesh использовать для статических объектов или объектов с малой частотой столкновений, поскольку расчет коллизий тяжелый.

Практическая схема работы

  1. Создается Body с определенной массой.
  2. Добавляются Shape с указанием локальных смещений и ориентаций.
  3. Cannon.js автоматически пересчитывает центр масс и тензор инерции.
  4. При симуляции движка каждый шаг пересчитываются позиции форм относительно тела, проверяются столкновения и обновляется физика.

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