В библиотеке Cannon.js физические объекты
разделяются на тела (Body) и
формы (Shape). Тело определяет массу,
позицию, ориентацию и физические свойства объекта, тогда как форма
описывает его геометрию для расчёта столкновений. Важным аспектом
является возможность смещать и вращать форму относительно центра масс
тела, что позволяет строить сложные конструкции и корректно моделировать
распределение массы.
По умолчанию форма добавляется к телу с центром в начале координат
тела. Для создания формы с смещением используется объект
Vec3:
const shape = new CANNON.Box(new CANNON.Vec3(1, 1, 1));
const offset = new CANNON.Vec3(0, 2, 0);
body.addShape(shape, offset);
shape — экземпляр формы (Box,
Sphere, Cylinder и др.).offset — вектор смещения формы относительно позиции
тела.Смещение важно, когда необходимо разместить форму не в центре тела, например, верхнюю часть объекта или выступающую деталь. Cannon.js учитывает смещение при вычислении инерции тела автоматически.
Форма может быть повернута относительно тела с помощью
кватерниона (Quaternion):
const shape = new CANNON.Box(new CANNON.Vec3(1, 1, 1));
const offset = new CANNON.Vec3(0, 2, 0);
const orientation = new CANNON.Quaternion();
orientation.setFromEuler(Math.PI / 4, 0, 0, 'XYZ');
body.addShape(shape, offset, orientation);
orientation задаёт локальный поворот формы.setFromEuler позволяет использовать привычные углы
Эйлера.Комбинация смещения и ориентации даёт полный контроль над положением формы внутри тела. Поворот формы влияет на столкновения и физику, так как локальные координаты формы пересчитываются в мировые с учётом позиции и ориентации тела.
Одно тело может содержать несколько форм с различными смещениями и ориентациями:
const body = new CANNON.Body({ mass: 5 });
const bottom = new CANNON.Box(new CANNON.Vec3(2, 0.5, 2));
body.addShape(bottom, new CANNON.Vec3(0, -0.5, 0));
const top = new CANNON.Sphere(1);
body.addShape(top, new CANNON.Vec3(0, 1.5, 0));
bottom и top имеют разные смещения.Смещение формы изменяет центр масс тела. При
добавлении формы с ненулевым смещением библиотека пересчитывает инерцию,
что влияет на вращение и динамику. Для статических тел
(mass = 0) смещение влияет только на столкновения, а для
динамических тел — на кинематику и момент инерции.
Пример динамического пересчёта:
const body = new CANNON.Body({ mass: 2 });
const box = new CANNON.Box(new CANNON.Vec3(1, 1, 1));
body.addShape(box, new CANNON.Vec3(0, 1, 0));
// Инерция тела обновлена с учётом смещения формы
console.log(body.invInertia);
invInertia отражает обратную матрицу инерции, которая
используется для вычисления вращательных ускорений.
Для сложных объектов удобно комбинировать формы с индивидуальными смещениями и кватернионами:
const body = new CANNON.Body({ mass: 10 });
const base = new CANNON.Box(new CANNON.Vec3(2, 0.5, 2));
body.addShape(base);
const pillar = new CANNON.Cylinder(0.2, 0.2, 3, 16);
const pillarOffset = new CANNON.Vec3(1, 1.5, 0);
const pillarQuat = new CANNON.Quaternion();
pillarQuat.setFromEuler(0, 0, Math.PI / 2, 'XYZ');
body.addShape(pillar, pillarOffset, pillarQuat);
После добавления формы её локальная трансформация фиксируется. Для изменения смещения или ориентации требуется удалить и заново добавить форму:
body.removeShape(shape);
body.addShape(shape, new CANNON.Vec3(0, 3, 0), new CANNON.Quaternion());
Прямое редактирование смещения или кватерниона формы не поддерживается, так как это нарушает согласованность инерции и столкновений.
Использование смещения и поворота форм расширяет возможности моделирования в Cannon.js, позволяя создавать многоформенные объекты с точной физической симуляцией и корректной динамикой.