Класс Spring предназначен для моделирования упругих соединений между телами в физическом движке Cannon-es. Он позволяет создавать поведение пружин, тянущих два тела друг к другу с определённой жесткостью и демпфированием, что необходимо для симуляции мягких связей, подвесок, мягких тканей и других динамических систем.
Конструктор класса имеет следующую сигнатуру:
new CANNON.Spring(bodyA, bodyB, options)
Параметры:
bodyA — первое тело (CANNON.Body) для
соединения пружиной.
bodyB — второе тело (CANNON.Body) для
соединения.
options — объект настроек пружины:
restLength — длина пружины в состоянии покоя (по
умолчанию 1).stiffness — коэффициент жёсткости пружины, определяет
силу восстановления (по умолчанию 100).damping — коэффициент демпфирования, ослабляющий
колебания (по умолчанию 1).localAnchorA — точка крепления на bodyA в
локальных координатах.localAnchorB — точка крепления на bodyB в
локальных координатах.Пример создания пружины:
import * as CANNON from "cannon-es";
const spring = new CANNON.Spring(bodyA, bodyB, {
restLength: 2,
stiffness: 50,
damping: 5,
localAnchorA: new CANNON.Vec3(0, 1, 0),
localAnchorB: new CANNON.Vec3(0, -1, 0)
});
applyForce()Метод applyForce рассчитывает и применяет силу пружины к телам. Обычно вызывается внутри игрового цикла после интеграции шагов физики.
Синтаксис:
spring.applyForce()
Принцип работы:
Вычисляется мировая позиция анкерных точек:
worldAnchorA = bodyA.pointToWorldFrame(localAnchorA)
worldAnchorB = bodyB.pointToWorldFrame(localAnchorB)Вычисляется вектор расстояния между точками и его длина:
let delta = worldAnchorB.vsub(worldAnchorA)
let currentLength = delta.length()Рассчитывается сила пружины по закону Гука:
let forceMagnitude = -stiffness * (currentLength - restLength)Добавляется демпфирующий компонент:
let relativeVelocity = bodyB.velocity.vsub(bodyA.velocity)
let dampingForce = relativeVelocity.dot(delta.unit()) * damping
forceMagnitude -= dampingForceПрименение силы к телам:
let force = delta.unit().scale(forceMagnitude)
bodyA.applyForce(force, worldAnchorA)
bodyB.applyForce(force.scale(-1), worldAnchorB)Точки крепления localAnchorA и localAnchorB позволяют смещать приложение силы от центра масс:
spring.localAnchorA.set(0, 0.5, 0)
spring.localAnchorB.set(0, -0.5, 0)
Это особенно полезно для имитации подвесок, мягких суставов или соединений, где сила не должна приложиться строго к центру массы тела.
Пружины удобно использовать для:
Пример использования в игровом цикле:
world.addEventListener("postStep", function () {
spring.applyForce()
});
Такой подход гарантирует, что сила пружины учитывается после каждого шага интеграции физики, обеспечивая стабильное поведение соединений.
Можно создавать массивы пружин для моделирования сеток или мягких
тел, где каждая пружина соединяет соседние тела. Использование
applyForce() для всех пружин после каждого шага физики
позволяет создать реалистичную эластичную структуру с эффектом
растяжения и сжатия.