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 определяет локальную ориентацию формы.Использование смещений позволяет строить сложные объекты из нескольких форм, например, моделировать автомобиль с отдельными кузовом и колесами.
Форма не существует отдельно от тела. Основные механизмы взаимодействия:
Центр масс Каждое тело имеет собственный центр масс. Добавленные формы могут быть смещены, но физический расчет движется относительно центра масс тела.
Инерционные свойства Body
автоматически пересчитывает инерционные тензоры на основе добавленных
форм. Если форма имеет смещение, инерционный тензор корректируется с
учетом положения формы.
Коллизии и контакты Cannon.js использует форму для вычисления столкновений. Для каждой формы рассчитывается контакт с другими телами, учитывая смещение и ориентацию.
Множественные формы Массив 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();ShapeBox, Sphere),
особенно для динамических тел.Trimesh использовать
для статических объектов или объектов с малой частотой столкновений,
поскольку расчет коллизий тяжелый.Body с определенной массой.Shape с указанием локальных смещений и
ориентаций.Эта архитектура позволяет создавать сцены с множеством объектов различной сложности, обеспечивая баланс между точностью симуляции и производительностью.