Sphere

В Cannon.js сфера (Sphere) представлена как объект геометрии для физического тела (Body) с радиусом radius. Основное преимущество сферической формы заключается в том, что столкновения рассчитываются проще, чем для сложных форм, благодаря полной симметрии относительно всех осей.

const radius = 1;
const sphereShape = new CANNON.Sphere(radius);
const sphereBody = new CANNON.Body({
    mass: 5, // масса тела
    shape: sphereShape,
    position: new CANNON.Vec3(0, 5, 0) // начальная позиция
});
world.addBody(sphereBody);

Ключевые параметры:

  • radius — радиус сферы. Определяет размер и момент инерции.
  • mass — масса тела, влияет на динамику движения.
  • position — вектор CANNON.Vec3, задающий начальное положение тела.
  • material — физический материал для взаимодействия с другими объектами (трение, упругость).

Инерция и момент инерции

Для сферического тела момент инерции вычисляется автоматически Cannon.js, исходя из массы и радиуса:

[ I = m r^2]

где m — масса тела, r — радиус. Это обеспечивает корректное вращение тела при столкновениях или приложении крутящих моментов.

Если требуется, можно задавать пользовательский момент инерции через свойство inertia, но в большинстве случаев стандартных вычислений достаточно.


Создание тела и добавление к миру

Сфера создаётся как комбинация Shape и Body. Shape задаёт геометрию для столкновений, а Body управляет физикой и динамикой:

const sphereShape = new CANNON.Sphere(2);
const sphereBody = new CANNON.Body({ mass: 10 });
sphereBody.addShape(sphereShape);
sphereBody.position.set(0, 10, 0);
world.addBody(sphereBody);

Использование метода addShape позволяет комбинировать несколько форм в одном теле для более сложной геометрии.


Столкновения сфер

Сферы имеют оптимизированный алгоритм столкновений благодаря своей симметрии. Cannon.js рассчитывает столкновение двух сфер через расстояние между центрами:

  • Если расстояние между центрами меньше суммы радиусов, происходит столкновение.
  • Нормаль контакта определяется как единичный вектор от центра первой сферы к центру второй.
  • Сила отталкивания рассчитывается с учётом упругости (restitution) и массы тел.
sphereBody.material = new CANNON.Material({ friction: 0.5, restitution: 0.7 });

Взаимодействие с другими формами

Сфера корректно взаимодействует с другими примитивами Cannon.js, такими как:

  • Box — при столкновении вычисляется точка контакта, нормаль и сила отталкивания.
  • Plane — сфера скользит по плоскости и отскакивает с учётом коэффициента упругости.
  • ConvexPolyhedron — алгоритм более сложный, но сфера по-прежнему использует оптимизацию для точек контакта на поверхности.

Динамика и силы

Сфера реагирует на внешние силы и моменты точно так же, как любое тело:

const force = new CANNON.Vec3(0, 100, 0);
const point = new CANNON.Vec3(0, 0, 0); // точка приложения силы в локальных координатах
sphereBody.applyForce(force, point);
  • applyForce — прикладывает силу к определённой точке, вызывая как линейное ускорение, так и вращение.
  • applyImpulse — мгновенное изменение скорости тела, полезно для столкновений.

Управление вращением

Сфера может вращаться вокруг любой оси, а её симметрия делает поведение стабильным. Для управления вращением можно использовать:

sphereBody.angularVelocity.set(0, 10, 0);
sphereBody.torque.set(0, 5, 0);
  • angularVelocity — текущая угловая скорость.
  • torque — крутящий момент, добавляющий ускорение вращения.

Оптимизация и особенности

  • Сфера является самой лёгкой геометрией для расчёта столкновений, поэтому её рекомендуется использовать в больших симуляциях.
  • Для имитации жидкости или шариков в песочнице часто используют массив сфер с небольшим радиусом.
  • Размер сферы напрямую влияет на частоту столкновений и стабильность интегратора: слишком маленькая сфера может «проскальзывать» через объекты при больших шагах симуляции.

Комбинирование с визуализацией

Сфера в Cannon.js легко синхронизируется с Three.js или Babylon.js для визуализации:

const geometry = new THREE.SphereGeometry(sphereBody.shapes[0].radius, 32, 32);
const material = new THREE.MeshStandardMaterial({ color: 0xff0000 });
const mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);

function update() {
    mesh.position.copy(sphereBody.position);
    mesh.quaternion.copy(sphereBody.quaternion);
}

Это обеспечивает точное соответствие физической модели и визуальной сцены.


Сферы в Cannon.js обеспечивают простое и эффективное решение для симуляции объектов с круглыми формами, позволяют комбинировать физику и визуализацию, а также служат базой для создания сложных динамических систем.