Обзор классов constraints

Библиотека Ammo.js предоставляет мощный набор инструментов для моделирования физики в браузере. Одной из ключевых возможностей является использование constraints — ограничений, связывающих два объекта и ограничивающих их движение относительно друг друга. Constraints позволяют реализовать суставы, подвески, соединения механизмов и другие сложные взаимодействия.

В Ammo.js каждый constraint наследуется от базового класса btTypedConstraint, который инкапсулирует общие свойства и методы ограничений. Все специфические типы constraints расширяют этот функционал, добавляя уникальные параметры и возможности.


btPoint2PointConstraint

btPoint2PointConstraint (P2P, или шарнир с точкой) — одно из самых простых ограничений. Оно фиксирует два тела так, чтобы выбранные точки на них оставались на одинаковом расстоянии.

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

  • pivotInA и pivotInB — координаты точек закрепления относительно локальных систем тел A и B.
  • Поддержка soft constraint через параметр m_setting.m_tau для сглаживания движения.
  • Простота использования для моделей подвесок и маятников.

Пример создания:

const pivotA = new Ammo.btVector3(0, 1, 0);
const pivotB = new Ammo.btVector3(0, -1, 0);
const constraint = new Ammo.btPoint2PointConstraint(bodyA, bodyB, pivotA, pivotB);
physicsWorld.addConstraint(constraint, true);

btHingeConstraint

btHingeConstraint моделирует сустав, вращающийся вокруг одной оси, подобно дверной петле.

Ключевые параметры:

  • pivotInA / pivotInB — точки вращения в локальных координатах тел.
  • axisInA / axisInB — векторы осей вращения.
  • Поддержка ограничения угла поворота через setLimit(minAngle, maxAngle).
  • Возможность добавления моторного привода: enableAngularMotor(true, targetVelocity, maxMotorImpulse).

Пример создания:

const hinge = new Ammo.btHingeConstraint(bodyA, bodyB, pivotA, pivotB, axisA, axisB, true);
hinge.setLimit(-Math.PI/4, Math.PI/4);
hinge.enableAngularMotor(true, 1.0, 10.0);
physicsWorld.addConstraint(hinge, true);

HingeConstraint широко используется для механических моделей: дверей, колес, рычагов.


btSliderConstraint

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

Основные свойства:

  • frameInA / frameInB — локальные системы координат, определяющие ось движения и вращения.
  • Ограничения движения: setLowerLinLimit(value), setUpperLinLimit(value).
  • Ограничения вращения: setLowerAngLimit(value), setUpperAngLimit(value).
  • Поддержка моторных приводов для линейного и углового движения.

Используется для рельсовых механизмов, поршней, направляющих элементов.


btConeTwistConstraint

btConeTwistConstraint реализует сустав, ограничивающий тело конусообразной зоной вращения и дополнительным скручиванием вокруг собственной оси.

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

  • Установка углов ограничения через setLimit(swingSpan1, swingSpan2, twistSpan).
  • Применение для моделей рук, плечевых суставов или подвесок с вращением и наклоном.
  • Поддержка мягких ограничений для реалистичного поведения.

Пример создания:

const coneTwist = new Ammo.btConeTwistConstraint(bodyA, bodyB, frameA, frameB);
coneTwist.setLimit(Math.PI/4, Math.PI/4, Math.PI/8);
physicsWorld.addConstraint(coneTwist, true);

btGeneric6DofConstraint

btGeneric6DofConstraint — универсальный 6-степенной свободы constraint. Позволяет ограничивать движение тела по всем осям и вращение вокруг них.

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

  • Управление диапазонами движения через setLinearLowerLimit, setLinearUpperLimit, setAngularLowerLimit, setAngularUpperLimit.
  • Поддержка моторных приводов для каждой степени свободы.
  • Может использоваться для реализации сложных механизмов и роботов.

Пример:

const dof = new Ammo.btGeneric6DofConstraint(bodyA, bodyB, frameA, frameB, true);
dof.setLinearLowerLimit(new Ammo.btVector3(-1, 0, 0));
dof.setLinearUpperLimit(new Ammo.btVector3(1, 0, 0));
physicsWorld.addConstraint(dof, true);

btFixedConstraint

btFixedConstraint жестко связывает два тела, фиксируя все степени свободы.

Применение:

  • Создание составных объектов из нескольких частей.
  • Используется для соединения объектов без возможности движения относительно друг друга.

Пример создания:

const fixed = new Ammo.btFixedConstraint(bodyA, bodyB, frameA, frameB);
physicsWorld.addConstraint(fixed, true);

Общие методы и свойства Constraints

Все constraints имеют общий набор методов, который обеспечивает взаимодействие с физическим миром:

  • setEnabled(bool) — включение/отключение ограничения.
  • getRigidBodyA() / getRigidBodyB() — доступ к связанным телам.
  • setBreakingImpulseThreshold(value) — порог силы разрушения ограничения.
  • enableFeedback(bool) и getAppliedImpulse() — получение силы, действующей на constraint, полезно для анализа и игровых эффектов.

Взаимодействие с миром и производительность

Constraints добавляются в physicsWorld через addConstraint, где второй параметр отвечает за мягкое ограничение при коллизиях. Использование constraints влияет на производительность: сложные ограничения требуют больше вычислений, особенно при мягких соединениях и motor-driven приводах. Оптимизация достигается правильным выбором типа constraint и минимизацией лишних степеней свободы.


Constraints в Ammo.js обеспечивают богатый инструментарий для моделирования реалистичных физических взаимодействий между объектами, позволяя создавать как простые механизмы, так и сложные динамические системы. Они являются фундаментом для любой физической симуляции, где объекты должны взаимодействовать через ограничения движения и вращения.