В Cannon.js объект Body представляет физическое тело в
симуляции. Обычно Body связывается с одной формой
(Shape), например, Box, Sphere
или Cylinder. Однако для моделирования сложных объектов
часто требуется объединение нескольких форм в один Body.
Это реализуется с помощью составных тел, когда один
Body содержит несколько форм с индивидуальными смещениями и
ориентациями относительно центра масс.
Каждую форму можно прикрепить к Body через метод
addShape(shape, offset, orientation).
Синтаксис:
body.addShape(shape, offsetVector, quaternion);
shape — объект формы (CANNON.Box,
CANNON.Sphere и т.д.).offsetVector — объект CANNON.Vec3,
задающий смещение формы относительно центра масс тела.quaternion — объект CANNON.Quaternion,
определяющий ориентацию формы относительно тела.Пример: составное тело с кубом и сферой
const body = new CANNON.Body({
mass: 5,
position: new CANNON.Vec3(0, 5, 0)
});
const boxShape = new CANNON.Box(new CANNON.Vec3(1, 1, 1));
const sphereShape = new CANNON.Sphere(0.5);
body.addShape(boxShape); // куб в центре тела
body.addShape(sphereShape, new CANNON.Vec3(0, 1.5, 0)); // сфера выше куба
world.addBody(body);
В этом примере куб формирует основу тела, а сфера располагается над
ним. Смещение Vec3(0, 1.5, 0) указывает, что центр сферы
находится на 1.5 единицы выше центра масс тела.
Cannon.js автоматически рассчитывает массу и момент
инерции тела с учётом всех форм, добавленных через
addShape. Если формы имеют разные смещения, центр масс тела
смещается, а инерция корректно учитывает распределение массы.
Особенности:
Пример расчёта с асимметричным телом:
const body = new CANNON.Body({ mass: 10 });
const base = new CANNON.Box(new CANNON.Vec3(2, 0.5, 1));
const arm = new CANNON.Box(new CANNON.Vec3(0.5, 2, 0.5));
body.addShape(base); // основание
body.addShape(arm, new CANNON.Vec3(2.5, 1.5, 0)); // "рука" справа и выше
console.log(body.inertia); // автоматически рассчитанный тензор инерции
Каждая форма может иметь собственную ориентацию через
CANNON.Quaternion. Это позволяет создавать наклонённые или
вращающиеся элементы внутри одного Body.
Пример: наклонённая плита
const tiltedShape = new CANNON.Box(new CANNON.Vec3(1, 0.2, 2));
const tiltQuat = new CANNON.Quaternion();
tiltQuat.setFromAxisAngle(new CANNON.Vec3(0, 0, 1), Math.PI / 6); // наклон 30 градусов
body.addShape(tiltedShape, new CANNON.Vec3(0, 0, 0), tiltQuat);
Body.Body, тем выше нагрузка на расчёт столкновений, особенно
если формы сложные или имеют наклон.Body.Составные тела полностью интегрируются с физическим миром:
applyForce и applyLocalForce, при этом
смещения форм учитываются.Пример применения силы к составному телу:
const force = new CANNON.Vec3(0, 500, 0);
const point = new CANNON.Vec3(1, 0, 0); // точка относительно центра масс
body.applyForce(force, point);
Составные тела в Cannon.js позволяют создавать объекты любой сложности, комбинируя простые формы с разными смещениями и ориентациями, сохраняя точность физической симуляции и контроль над динамикой.