btPoint2PointConstraint в Ammo.js реализует механизм шарового шарнира, который позволяет двум объектам вращаться относительно точки соединения без ограничения углов поворота. Этот тип ограничения особенно полезен для моделирования подвесок, маятников, костных соединений в риггинге и симуляции гибких структур.
Для создания btPoint2PointConstraint необходимы следующие элементы:
Существует два варианта конструктора:
// Соединение одного тела с фиксированной точкой в мире
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);
Ключевые моменты:
После создания ограничение можно настроить для повышения стабильности и контроля симуляции:
// Установка мягкости (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);
Объяснение параметров:
Чтобы ограничение начало работать в симуляции, его необходимо добавить в btDiscreteDynamicsWorld:
dynamicsWorld.addConstraint(constraint, true);
Флаг true указывает на то, что ограничение должно
включать в себя коллизию между связанными телами. Это предотвращает
пересечения объектов, если они находятся слишком близко.
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);
Подвеска транспортного средства Соединение колеса с рамой автомобиля с сохранением свободы вращения, что позволяет симулировать пружины и рычажные подвески.
Скелетная анимация Для простых ragdoll-моделей используется цепочка btPoint2PointConstraint для имитации суставов конечностей.
timeStep) и достаточную точность solver’а.btPoint2PointConstraint часто применяется в сочетании с:
Эти комбинации позволяют строить сложные механические системы с гибкой и реалистичной физикой.
getPivotInA() / getPivotInB() – возвращают
текущие локальные координаты pivot для тел.setPivotA(btVector3) /
setPivotB(btVector3) – позволяют динамически изменять точку
крепления во время симуляции.updateRHS() – обновляет вектор силы ограничения после
изменения pivot или параметров.Использование этих методов повышает контроль над динамикой сцены и позволяет создавать адаптивные физические системы.
Шаровой шарнир в Ammo.js является простым, но мощным инструментом для построения гибких соединений между объектами, обеспечивая реалистичное поведение без сложного кода и тонкой настройки.