Класс Body является центральным элементом физического движка Cannon.js. Он представляет физическое тело в трёхмерном пространстве и управляет его поведением под действием сил, столкновений и гравитации. Каждый объект Body может иметь массу, форму, позицию, ориентацию и физические свойства материала.
import * as CANNON from 'cannon-es';
const body = new CANNON.Body({
mass: 5, // масса тела в кг
position: new CANNON.Vec3(0, 10, 0), // начальная позиция
velocity: new CANNON.Vec3(0, 0, 0), // начальная скорость
});
Параметр mass определяет массу тела.
const staticBody = new CANNON.Body({ mass: 0 }); // статическое тело
const dynamicBody = new CANNON.Body({ mass: 10 }); // динамическое тело
CANNON.Vec3,
задающий начальную координату.CANNON.Quaternion. Используется для вращения
тела без проблем с углами Эйлера.body.position.set(1, 2, 3);
body.quaternion.setFromEuler(Math.PI/2, 0, 0);
CANNON.Vec3.body.velocity.set(5, 0, 0);
body.angularVelocity.set(0, 1, 0);
body.linearDamping = 0.01; // почти без затухания
body.angularDamping = 0.1; // умеренное затухание вращения
Для корректной физической симуляции каждый объект Body должен иметь хотя бы одну форму (shape). Cannon.js поддерживает несколько типов форм:
Vec3).Форма добавляется методом addShape:
const sphereShape = new CANNON.Sphere(1);
body.addShape(sphereShape);
Можно добавлять несколько форм с локальными смещениями и ориентацией:
const boxShape = new CANNON.Box(new CANNON.Vec3(1, 1, 1));
body.addShape(boxShape, new CANNON.Vec3(0, 2, 0));
Каждое тело может иметь материал
CANNON.Material, который определяет свойства трения и
упругости при столкновениях.
const material = new CANNON.Material({ friction: 0.4, restitution: 0.6 });
body.material = material;
Чтобы задать взаимодействие между двумя материалами, используется
CANNON.ContactMaterial:
const contactMaterial = new CANNON.ContactMaterial(materialA, materialB, {
friction: 0.5,
restitution: 0.7
});
world.addContactMaterial(contactMaterial);
const force = new CANNON.Vec3(0, 100, 0);
body.applyForce(force, body.position);
DYNAMIC,
STATIC, KINEMATIC.body.type = CANNON.Body.DYNAMIC;
body.fixedRotation = true;
body.collisionFilterGroup = 1;
body.collisionFilterMask = 2;
После создания всех тел их добавляют в мир
CANNON.World:
const world = new CANNON.World();
world.gravity.set(0, -9.82, 0);
world.addBody(body);
Обновление мира выполняется методом step:
const dt = 1 / 60;
world.step(dt);
Каждое тело обновляет свою позицию, ориентацию и столкновения на каждом шаге симуляции.
Класс Body в Cannon.js обеспечивает детальное управление физическими объектами. Через параметры массы, формы, материалов и методов можно полностью моделировать динамику и столкновения. Понимание всех свойств и методов Body является ключевым для создания сложных трёхмерных физически корректных симуляций.