btSliderConstraint — это специализированный тип ограничений (constraints) в библиотеке Ammo.js, предназначенный для моделирования линейного и вращательного скольжения между двумя телами. Он позволяет создавать конструкции, аналогичные поршням, направляющим или тележкам, движущимся по рельсам, обеспечивая контроль как линейного, так и углового перемещения.
Линейное скольжение (Linear Translation) Позволяет ограничивать движение вдоль одной оси, задавая минимальные и максимальные пределы. При необходимости можно разрешить свободное движение без ограничений.
Вращательное скольжение (Angular Translation) Контролирует вращение вокруг оси линейного перемещения. Пределы углового скольжения помогают моделировать, например, шарнирные соединения с ограниченным углом поворота.
Мягкие и жесткие ограничения Можно настроить мягкость (softness), демпфирование (damping) и упругость (restitution) как для линейного, так и для углового движения, создавая более реалистичную физику.
Объект btSliderConstraint создается через конструктор с передачей двух тел и их локальных систем координат:
let frameInA = new Ammo.btTransform();
frameInA.setIdentity();
frameInA.setOrigin(new Ammo.btVector3(0, 0, 0));
frameInA.getBasis().setEulerZYX(0, 0, 0);
let frameInB = new Ammo.btTransform();
frameInB.setIdentity();
frameInB.setOrigin(new Ammo.btVector3(0, 5, 0));
frameInB.getBasis().setEulerZYX(0, 0, 0);
let slider = new Ammo.btSliderConstraint(bodyA, bodyB, frameInA, frameInB, true);
bodyA и bodyB — объекты типа
btRigidBody, между которыми устанавливается
ограничение.frameInA и frameInB — локальные
трансформации, задающие положение и ориентацию ограничителя относительно
каждого тела.useLinearReferenceFrameA)
указывает, будет ли линейная система отсчета привязана к первому
телу.Для управления движением вдоль оси используют методы:
slider.setLowerLinLimit(-2.0); // минимальное линейное смещение
slider.setUpperLinLimit(2.0); // максимальное линейное смещение
Если задать равные значения, движение блокируется. Для свободного
движения можно использовать значения -Infinity и
Infinity.
Вращение вокруг оси линейного движения задается через:
slider.setLowerAngLimit(-Math.PI / 4); // минимальный угол
slider.setUpperAngLimit(Math.PI / 4); // максимальный угол
Это особенно полезно для имитации направляющих механизмов, где движение должно ограничиваться определенным углом.
btSliderConstraint поддерживает дополнительные параметры, позволяющие смягчать реакцию системы:
slider.setSoftnessDirLin(0.7); // мягкость линейного движения
slider.setRestitutionDirLin(0.5); // упругость линейного движения
slider.setDampingDirLin(0.1); // демпфирование линейного движения
slider.setSoftnessDirAng(0.5); // мягкость вращения
slider.setRestitutionDirAng(0.2); // упругость вращения
slider.setDampingDirAng(0.05); // демпфирование вращения
softness влияет на то, насколько «жестко» ограничение
удерживает пределы.restitution задает коэффициент упругого отскока при
достижении предела.damping уменьшает колебания и стабилизирует
систему.Чтобы отслеживать движение в реальном времени:
let linPos = slider.getLinearPos(); // текущее линейное смещение
let angPos = slider.getAngularPos(); // текущий угол поворота
let linVel = slider.getTargetLinMotorVelocity(); // скорость линейного мотора
let angVel = slider.getTargetAngMotorVelocity(); // скорость вращательного мотора
Эти методы полезны для управления анимацией или синхронизации с другими системами.
btSliderConstraint поддерживает линейные и вращательные моторы:
slider.setPoweredLinMotor(true);
slider.setTargetLinMotorVelocity(1.0); // скорость линейного движения
slider.setMaxLinMotorForce(10.0); // максимальная сила мотора
slider.setPoweredAngMotor(true);
slider.setTargetAngMotorVelocity(Math.PI / 2); // скорость вращения
slider.setMaxAngMotorForce(5.0); // максимальная сила вращения
Моторы позволяют автоматизировать движение тел по направляющей или реализовать динамические механизмы с контролем силы.
frameInA и
frameInB для минимизации вычислений.После создания и настройки ограничения необходимо добавить его в физический мир:
physicsWorld.addConstraint(slider, true);
Параметр true активирует автоматическую обработку
коллизий между связанными телами. Это предотвращает некорректное
проникновение объектов друг в друга при высоких скоростях.
btSliderConstraint сочетает в себе гибкость и точность для моделирования скользящих механизмов и направляющих конструкций. Возможность задавать линейные и угловые пределы, а также моторы и демпфирование делает его универсальным инструментом для динамических симуляций в Ammo.js.