Класс Body и его параметры

Класс 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), // начальная скорость
});

Параметры конструктора Body

mass

Параметр mass определяет массу тела.

  • 0 – тело статическое, не подвержено динамике.
  • >0 – динамическое тело, подчиняется законам физики.
const staticBody = new CANNON.Body({ mass: 0 }); // статическое тело
const dynamicBody = new CANNON.Body({ mass: 10 }); // динамическое тело

position и quaternion

  • position – вектор CANNON.Vec3, задающий начальную координату.
  • quaternion – ориентация тела в пространстве в виде кватерниона CANNON.Quaternion. Используется для вращения тела без проблем с углами Эйлера.
body.position.set(1, 2, 3);
body.quaternion.setFromEuler(Math.PI/2, 0, 0);

velocity и angularVelocity

  • velocity – линейная скорость тела.
  • angularVelocity – угловая скорость вращения.
  • Оба параметра представляют собой объекты CANNON.Vec3.
body.velocity.set(5, 0, 0);
body.angularVelocity.set(0, 1, 0);

linearDamping и angularDamping

  • linearDamping – коэффициент затухания линейного движения (0–1).
  • angularDamping – коэффициент затухания вращения.
body.linearDamping = 0.01; // почти без затухания
body.angularDamping = 0.1; // умеренное затухание вращения

Форма тела: shape

Для корректной физической симуляции каждый объект Body должен иметь хотя бы одну форму (shape). Cannon.js поддерживает несколько типов форм:

  • CANNON.Sphere(radius) – сфера с радиусом radius.
  • CANNON.Box(halfExtents) – параллелепипед с половинными размерами halfExtents (Vec3).
  • CANNON.Cylinder(radiusTop, radiusBottom, height, numSegments) – цилиндр.
  • CANNON.Plane() – бесконечная плоскость.
  • CANNON.ConvexPolyhedron(vertices, faces) – выпуклый многогранник.

Форма добавляется методом 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);

Методы управления телом

  • applyForce(force, relativePoint) – прикладывает силу к телу в указанной точке.
  • applyImpulse(impulse, relativePoint) – мгновенное изменение скорости тела.
  • updateMassProperties() – пересчитывает инерцию и массу после изменения формы или массы.
const force = new CANNON.Vec3(0, 100, 0);
body.applyForce(force, body.position);

Дополнительные свойства

  • type – тип тела: DYNAMIC, STATIC, KINEMATIC.
  • collisionFilterGroup и collisionFilterMask – группы столкновений для селективного взаимодействия.
  • fixedRotation – запрет вращения тела.
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 является ключевым для создания сложных трёхмерных физически корректных симуляций.