В библиотеке Cannon.js ограничения (constraints) используются для управления поведением тел в физическом мире. Они позволяют связывать объекты, ограничивать их перемещение или вращение, создавать подвесные системы, шарниры и соединения различных типов. Каждый constraint действует как “невидимая сила”, корректирующая положение и ориентацию тел, чтобы удовлетворять заданным условиям.
Типичный workflow работы с ограничениями включает:
1. PointToPointConstraint Связывает две точки на разных телах, удерживая их на фиксированном расстоянии друг от друга.
const bodyA = new CANNON.Body({ mass: 1 });
const bodyB = new CANNON.Body({ mass: 1 });
const pivotA = new CANNON.Vec3(0, 0, 0);
const pivotB = new CANNON.Vec3(1, 0, 0);
const p2p = new CANNON.PointToPointConstraint(bodyA, pivotA, bodyB, pivotB);
world.addConstraint(p2p);
Особенности:
2. HingeConstraint Создает шарнирное соединение, позволяющее телам вращаться относительно друг друга вокруг одной оси.
const hinge = new CANNON.HingeConstraint(bodyA, bodyB, {
pivotA: new CANNON.Vec3(0, 0, 0),
axisA: new CANNON.Vec3(0, 1, 0),
pivotB: new CANNON.Vec3(1, 0, 0),
axisB: new CANNON.Vec3(0, 1, 0),
});
world.addConstraint(hinge);
Особенности:
axisA и axisB определяют ось вращения для
каждого тела.setLimits(min, max)), что важно для симуляции дверей,
рычагов, механических соединений.3. DistanceConstraint Удерживает расстояние между центрами тел фиксированным или в пределах заданного диапазона.
const distance = new CANNON.DistanceConstraint(bodyA, bodyB, 2);
world.addConstraint(distance);
Особенности:
maxForce,
ограничивающим максимальное усилие.4. LockConstraint Фиксирует два тела друг относительно друга, запрещая относительное движение и вращение.
const lock = new CANNON.LockConstraint(bodyA, bodyB);
world.addConstraint(lock);
Особенности:
Каждое ограничение имеет общие ключевые свойства:
Некоторые ограничения, такие как HingeConstraint, позволяют настраивать угол поворота и мотор для управления движением:
hinge.enableMotor();
hinge.setMotorSpeed(5);
hinge.setMotorMaxForce(10);
Для активации ограничения необходимо использовать метод:
world.addConstraint(constraint);
После добавления движок будет учитывать его при каждой интеграции физики. Ограничение начинает автоматически применять силы, корректируя движение тел.
Для удаления ограничения из мира применяется метод:
world.removeConstraint(constraint);
Важно:
maxForce может сделать симуляцию неустойчивой.Подвеска с амортизатором:
PointToPointConstraint для фиксации колеса к
шасси.DistanceConstraint с ограничением по длине для имитации
пружины.Двуосный шарнир:
HingeConstraint с пересекающимися осями для
создания свободы вращения по двум направлениям.Использование этих инструментов позволяет создавать реалистичные механические системы, моделировать цепи, рычаги, подвесные конструкции и полностью контролировать динамику объектов в симуляции.