В библиотеке Ammo.js моторы в ограничениях (constraints) используются для активного управления движением соединённых тел. Они позволяют задавать вращение или линейное движение в пределах ограничений, поддерживая физическую реалистичность симуляции. Моторы могут применяться в hinge, slider, generic 6DoF и других типах ограничений.
Для большинства ограничений включение мотора производится через соответствующий метод объекта ограничения. Например, для hinge constraint:
hinge.enableAngularMotor(true, targetVelocity, maxMotorImpulse);
Параметры метода:
true/false — включение или отключение мотора.targetVelocity — целевая угловая скорость (радианы в
секунду).maxMotorImpulse — максимальный импульс силы, который
может быть приложен мотором за один шаг симуляции.Если параметр maxMotorImpulse слишком мал, мотор не
сможет достичь заданной скорости. Слишком большое значение может вызвать
нестабильность симуляции.
Для slider constraint используется аналогичный подход:
slider.enableLinearMotor(true, targetVelocity, maxMotorForce);
targetVelocity — целевая линейная скорость (метры в
секунду).maxMotorForce — максимальная сила мотора.Моторы имеют несколько ключевых параметров, влияющих на поведение ограничения:
Целевая скорость (Target Velocity) Определяет направление и скорость движения или вращения. Может быть положительной или отрицательной для изменения направления.
Максимальный импульс или сила (Max Motor Impulse / Max Motor Force) Ограничивает величину силы, которую мотор может применять к телу. Использование слишком малого значения приводит к «проскакиванию» ограничения, слишком большое — к резким ускорениям.
Damping и Softness (для 6DoF constraint) В гибких соединениях моторы могут иметь параметры демпфирования и мягкости.
constraint.setParam(Ammo.CONSTRAINT_STOP_ERP, 0.5, axisIndex);
constraint.setParam(Ammo.CONSTRAINT_STOP_CFM, 0.01, axisIndex);
ERP (Error Reduction Parameter) контролирует скорость
коррекции ошибки ограничения.CFM (Constraint Force Mixing) регулирует мягкость
ограничения.Axis Index (для 6DoF и hinge constraints) Указывает, по какой оси применять мотор. В 6DoF constraint каждая ось имеет собственные параметры скорости и силы.
const hinge = new Ammo.btHingeConstraint(bodyA, bodyB, pivotA, pivotB, axis, axis, true);
hinge.enableAngularMotor(true, Math.PI, 10); // вращение со скоростью π рад/с, максимум 10 Н·м
physicsWorld.addConstraint(hinge, true);
bodyB
относительно bodyA.hinge.setMotorTargetVelocity(newVelocity);
const slider = new Ammo.btSliderConstraint(bodyA, bodyB, frameInA, frameInB, true);
slider.enableLinearMotor(true, 0.5, 20); // движение вдоль оси с 0.5 м/с, максимальная сила 20 Н
physicsWorld.addConstraint(slider, true);
Limits (ограничения угла или перемещения) совместимы с мотором. Мотор будет работать только внутри разрешённого диапазона:
hinge.setLimit(-Math.PI/4, Math.PI/4);
hinge.enableAngularMotor(true, Math.PI/2, 5);Softness и damping помогают избежать резких рывков при достижении пределов.
В 6DoF constraints можно одновременно включить моторы на нескольких осях, задавая индивидуальные targetVelocity и maxMotorImpulse.
enableAngularMotor(enable, targetVelocity, maxImpulse)
— включает мотор для вращения.enableLinearMotor(enable, targetVelocity, maxForce) —
включает мотор для линейного движения.setMotorTargetVelocity(velocity) — динамически изменяет
скорость мотора.getMotorTargetVelocity() — возвращает текущую целевую
скорость.setMaxMotorImpulse(impulse) /
setMaxMotorForce(force) — корректировка максимальной силы
или импульса.Моторы в ограничениях Ammo.js предоставляют гибкий и точный способ управления движением тел, позволяя создавать активные механизмы, роботов и динамические сцены с высокой степенью контроля над физикой.