btPoint2PointConstraint: шаровой шарнир

btPoint2PointConstraint в Ammo.js реализует механизм шарового шарнира, который позволяет двум объектам вращаться относительно точки соединения без ограничения углов поворота. Этот тип ограничения особенно полезен для моделирования подвесок, маятников, костных соединений в риггинге и симуляции гибких структур.


Создание шарового шарнира

Для создания btPoint2PointConstraint необходимы следующие элементы:

  1. Rigid Body (тела) – объекты, которые будут соединены.
  2. Точка привязки (pivot point) – локальная координата внутри тела, где шарнир закрепляется.

Существует два варианта конструктора:

// Соединение одного тела с фиксированной точкой в мире
let pivot = new Ammo.btVector3(0, 1, 0);
let constraint = new Ammo.btPoint2PointConstraint(rigidBody, pivot);

// Соединение двух тел
let pivotA = new Ammo.btVector3(0, 1, 0);
let pivotB = new Ammo.btVector3(0, -1, 0);
let constraint = new Ammo.btPoint2PointConstraint(rigidBodyA, rigidBodyB, pivotA, pivotB);

Ключевые моменты:

  • pivot задается в локальных координатах тела.
  • Для двух тел шарнир гарантирует совпадение мировых позиций pivotA и pivotB в симуляции.
  • Конструктор не ограничивает вращение вокруг шарнира.

Настройка параметров

После создания ограничение можно настроить для повышения стабильности и контроля симуляции:

// Установка мягкости (softness)
constraint.setParam(Ammo.CONSTRAINT_PARAM_SOFTNESS, 0.9, 0);

// Установка силы торможения (damping)
constraint.setParam(Ammo.CONSTRAINT_PARAM_DAMPING, 0.1, 0);

// Установка силы коррекции (impulse clamp)
constraint.setParam(Ammo.CONSTRAINT_PARAM_ERP, 0.2, 0);

Объяснение параметров:

  • SOFTNESS – снижает жесткость ограничения, предотвращая резкие рывки.
  • DAMPING – гасит колебания и стабилизирует движение.
  • ERP (Error Reduction Parameter) – коэффициент исправления отклонений, помогает удерживать шарнир в заданной позиции.

Интеграция в мир Ammo.js

Чтобы ограничение начало работать в симуляции, его необходимо добавить в btDiscreteDynamicsWorld:

dynamicsWorld.addConstraint(constraint, true);

Флаг true указывает на то, что ограничение должно включать в себя коллизию между связанными телами. Это предотвращает пересечения объектов, если они находятся слишком близко.


Примеры практического применения

  1. Маятник Создание простого маятника путем соединения стержня с фиксированной точкой в пространстве. Шарнир обеспечивает свободное вращение стержня вокруг оси:
let pivot = new Ammo.btVector3(0, 2, 0);
let pendulum = new Ammo.btRigidBody(pendulumShapeInfo);
let pivotConstraint = new Ammo.btPoint2PointConstraint(pendulum, pivot);
dynamicsWorld.addConstraint(pivotConstraint, false);
  1. Подвеска транспортного средства Соединение колеса с рамой автомобиля с сохранением свободы вращения, что позволяет симулировать пружины и рычажные подвески.

  2. Скелетная анимация Для простых ragdoll-моделей используется цепочка btPoint2PointConstraint для имитации суставов конечностей.


Советы по оптимизации

  • Использовать локальные pivot точки, чтобы ограничение корректно реагировало на вращение тел.
  • Для длинных или тяжелых объектов увеличивать значение DAMPING, чтобы снизить колебания.
  • Комбинировать с другими ограничениями, например btHingeConstraint, если требуется ограничить вращение по одной оси.
  • Для стабильности симуляции выбирать небольшие шаги интеграции (timeStep) и достаточную точность solver’а.

Взаимодействие с другими типами ограничений

btPoint2PointConstraint часто применяется в сочетании с:

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

Эти комбинации позволяют строить сложные механические системы с гибкой и реалистичной физикой.


Важные методы

  • getPivotInA() / getPivotInB() – возвращают текущие локальные координаты pivot для тел.
  • setPivotA(btVector3) / setPivotB(btVector3) – позволяют динамически изменять точку крепления во время симуляции.
  • updateRHS() – обновляет вектор силы ограничения после изменения pivot или параметров.

Использование этих методов повышает контроль над динамикой сцены и позволяет создавать адаптивные физические системы.


Шаровой шарнир в Ammo.js является простым, но мощным инструментом для построения гибких соединений между объектами, обеспечивая реалистичное поведение без сложного кода и тонкой настройки.