Библиотека Ammo.js предоставляет мощный набор инструментов для моделирования физики в браузере. Одной из ключевых возможностей является использование constraints — ограничений, связывающих два объекта и ограничивающих их движение относительно друг друга. Constraints позволяют реализовать суставы, подвески, соединения механизмов и другие сложные взаимодействия.
В Ammo.js каждый constraint наследуется от базового класса btTypedConstraint, который инкапсулирует общие свойства и методы ограничений. Все специфические типы constraints расширяют этот функционал, добавляя уникальные параметры и возможности.
btPoint2PointConstraint (P2P, или шарнир с точкой) — одно из самых простых ограничений. Оно фиксирует два тела так, чтобы выбранные точки на них оставались на одинаковом расстоянии.
Особенности:
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 моделирует сустав, вращающийся вокруг одной оси, подобно дверной петле.
Ключевые параметры:
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 позволяет телу скользить вдоль оси с возможностью вращения. По сути, это комбинация линейного и вращательного ограничения.
Основные свойства:
setLowerLinLimit(value),
setUpperLinLimit(value).setLowerAngLimit(value),
setUpperAngLimit(value).Используется для рельсовых механизмов, поршней, направляющих элементов.
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 — универсальный 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 жестко связывает два тела, фиксируя все степени свободы.
Применение:
Пример создания:
const fixed = new Ammo.btFixedConstraint(bodyA, bodyB, frameA, frameB);
physicsWorld.addConstraint(fixed, true);
Все constraints имеют общий набор методов, который обеспечивает взаимодействие с физическим миром:
setEnabled(bool) — включение/отключение
ограничения.getRigidBodyA() / getRigidBodyB() — доступ
к связанным телам.setBreakingImpulseThreshold(value) — порог силы
разрушения ограничения.enableFeedback(bool) и getAppliedImpulse()
— получение силы, действующей на constraint, полезно для анализа и
игровых эффектов.Constraints добавляются в physicsWorld через
addConstraint, где второй параметр отвечает за мягкое
ограничение при коллизиях. Использование constraints влияет на
производительность: сложные ограничения требуют больше вычислений,
особенно при мягких соединениях и motor-driven приводах. Оптимизация
достигается правильным выбором типа constraint и минимизацией лишних
степеней свободы.
Constraints в Ammo.js обеспечивают богатый инструментарий для моделирования реалистичных физических взаимодействий между объектами, позволяя создавать как простые механизмы, так и сложные динамические системы. Они являются фундаментом для любой физической симуляции, где объекты должны взаимодействовать через ограничения движения и вращения.