Добавление и удаление ограничений

В библиотеке Cannon.js ограничения (constraints) используются для управления поведением тел в физическом мире. Они позволяют связывать объекты, ограничивать их перемещение или вращение, создавать подвесные системы, шарниры и соединения различных типов. Каждый constraint действует как “невидимая сила”, корректирующая положение и ориентацию тел, чтобы удовлетворять заданным условиям.

Типичный workflow работы с ограничениями включает:

  1. Создание тел (Body).
  2. Определение типа ограничения.
  3. Настройку параметров ограничения.
  4. Добавление ограничения в мир (World).
  5. При необходимости удаление ограничения из мира.

Основные типы ограничений

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);

Особенности:

  • pivotA и pivotB задают точки крепления в локальных координатах тел.
  • Constraint автоматически корректирует силы для поддержания заданной позиции точек.

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);

Особенности:

  • Полностью связывает тела, превращая их в одно жесткое целое.
  • Используется при моделировании твердых соединений или агрегатов, где движение отдельных частей нежелательно.

Параметры и свойства ограничений

Каждое ограничение имеет общие ключевые свойства:

  • maxForce — максимальная сила, которую constraint может применить для корректировки положения.
  • equations — массив уравнений, которые физический движок решает на каждом шаге для поддержания ограничения.
  • bodyA, bodyB — объекты, к которым применяется ограничение.

Некоторые ограничения, такие как HingeConstraint, позволяют настраивать угол поворота и мотор для управления движением:

hinge.enableMotor();
hinge.setMotorSpeed(5);
hinge.setMotorMaxForce(10);

Добавление ограничения в мир

Для активации ограничения необходимо использовать метод:

world.addConstraint(constraint);

После добавления движок будет учитывать его при каждой интеграции физики. Ограничение начинает автоматически применять силы, корректируя движение тел.

Удаление ограничения

Для удаления ограничения из мира применяется метод:

world.removeConstraint(constraint);

Важно:

  • Удаление constraints освобождает ресурсы и предотвращает ненужные вычисления.
  • После удаления тела больше не удерживаются в фиксированном положении или под определенным углом, и начинают подчиняться только другим силам и коллизиям.

Советы по работе с ограничениями

  1. Сбалансированное использование силы — слишком высокий maxForce может сделать симуляцию неустойчивой.
  2. Корректные локальные координаты — pivot и axis должны быть заданы в системе координат тела, иначе constraint будет работать некорректно.
  3. Удаление ненужных constraints — для оптимизации производительности важно убирать ограничения, которые больше не нужны.
  4. Комбинация constraints — несколько типов ограничений можно комбинировать, чтобы создавать сложные механизмы, например, подвески или роботов.

Примеры сложных комбинаций

Подвеска с амортизатором:

  • PointToPointConstraint для фиксации колеса к шасси.
  • DistanceConstraint с ограничением по длине для имитации пружины.

Двуосный шарнир:

  • Два HingeConstraint с пересекающимися осями для создания свободы вращения по двум направлениям.

Использование этих инструментов позволяет создавать реалистичные механические системы, моделировать цепи, рычаги, подвесные конструкции и полностью контролировать динамику объектов в симуляции.