В 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 обеспечивают простое и эффективное решение для симуляции объектов с круглыми формами, позволяют комбинировать физику и визуализацию, а также служат базой для создания сложных динамических систем.