Cannon.js — это физический движок для JavaScript, ориентированный на реалистичное моделирование твёрдых тел и их взаимодействий. Одним из ключевых элементов сложных симуляций являются сочленённые конструкции, включая цепи, рычажные системы и подвесные механизмы. Эти конструкции реализуются через комбинацию тел и ограничений (constraints), обеспечивая контроль над взаимным положением и движением объектов.
Для создания цепей и сочленений применяются различные типы ограничений:
PointToPointConstraint Ограничение фиксирует конкретные точки двух тел, позволяя им свободно вращаться вокруг этих точек. Применение: подвесные цепи, шарниры, простые соединения. Пример инициализации:
const constraint = new CANNON.PointToPointConstraint(bodyA, new CANNON.Vec3(0, -1, 0), bodyB, new CANNON.Vec3(0, 1, 0));
world.addConstraint(constraint);HingeConstraint Позволяет двум телам вращаться вокруг общей оси, ограничивая движение в одной степени свободы. Применение: двери, рычаги, колёса.
const hinge = new CANNON.HingeConstraint(bodyA, bodyB, {
pivotA: new CANNON.Vec3(1, 0, 0),
pivotB: new CANNON.Vec3(-1, 0, 0),
axisA: new CANNON.Vec3(0, 0, 1),
axisB: new CANNON.Vec3(0, 0, 1)
});
world.addConstraint(hinge);DistanceConstraint Поддерживает фиксированное расстояние между двумя телами. Используется для стабилизации цепей или предотвращения «растягивания» соединений.
const distanceConstraint = new CANNON.DistanceConstraint(bodyA, bodyB, 2.0);
world.addConstraint(distanceConstraint);LockConstraint Полностью фиксирует относительное положение и ориентацию между телами. Применение в жёстких структурах, когда требуется сохранить форму конструкции.
Цепь состоит из последовательности тел, соединённых ограничениями. Основной подход:
Создание сегментов цепи — обычно это небольшие коробки или цилиндры с одинаковыми размерами.
const segment = new CANNON.Body({
mass: 1,
shape: new CANNON.Box(new CANNON.Vec3(0.1, 0.5, 0.1)),
position: new CANNON.Vec3(0, i * -1, 0)
});
world.addBody(segment);Соединение сегментов PointToPointConstraint:
const constraint = new CANNON.PointToPointConstraint(prevSegment, new CANNON.Vec3(0, -0.5, 0), segment, new CANNON.Vec3(0, 0.5, 0));
world.addConstraint(constraint);Настройка массы и инерции: для реалистичной динамики верхние сегменты часто делают легче, нижние — тяжелее. Это предотвращает чрезмерное раскачивание и «висение» цепи.
Цепи и сочленённые конструкции склонны к нестабильности при больших скоростях и высоких массах. Основные методы повышения точности:
Повышение частоты интеграции (time step)
world.step(1/120);Использование жёстких ограничений через
maxForce и stiffness в HingeConstraint или
DistanceConstraint.
const hinge = new CANNON.HingeConstraint(bodyA, bodyB, { maxForce: 1e5, stiffness: 1e4 });Разделение сегментов на меньшие для уменьшения тряски и предотвращения взаимного пересечения тел.
Подвесной мост Состоит из цепочек, соединяющих
деревянные плиты с канатами. Используются комбинации
DistanceConstraint и HingeConstraint для
имитации гибкости.
Маятниковые системы Серия тел с
HingeConstraint, позволяющая моделировать многозвенные
маятники с амплитудной регулировкой через изменение массы и длины
сегментов.
Рычажные механизмы Сочетание
HingeConstraint и PointToPointConstraint
позволяет передавать вращательное движение по цепи рычагов, создавая
сложные кинематические передачи.
Гравитация: влияет на все сегменты одинаково, но длина и масса сегментов регулируют скорость падения и колебаний.
Ветер и импульсы: применяются через
body.applyForce(force, worldPoint) или
body.applyImpulse(impulse, worldPoint).
segment.applyForce(new CANNON.Vec3(0, 50, 0), segment.position);Соприкосновение с объектами: для предотвращения
прохождения цепи через статические тела используют корректные формы
коллайдеров (Box, Sphere,
ConvexPolyhedron).
angularDamping для предотвращения слишком
резких колебаний.Цепи и сочленённые конструкции в Cannon.js позволяют создавать широкую гамму реалистичных механических и подвесных систем. Комбинация разных типов ограничений, правильная настройка массы и форм тел обеспечивают точное моделирование динамики и устойчивость даже при сложных взаимодействиях.