btSliderConstraint: линейное скольжение

btSliderConstraint — это специализированный тип ограничений (constraints) в библиотеке Ammo.js, предназначенный для моделирования линейного и вращательного скольжения между двумя телами. Он позволяет создавать конструкции, аналогичные поршням, направляющим или тележкам, движущимся по рельсам, обеспечивая контроль как линейного, так и углового перемещения.

Основные возможности

  • Линейное скольжение (Linear Translation) Позволяет ограничивать движение вдоль одной оси, задавая минимальные и максимальные пределы. При необходимости можно разрешить свободное движение без ограничений.

  • Вращательное скольжение (Angular Translation) Контролирует вращение вокруг оси линейного перемещения. Пределы углового скольжения помогают моделировать, например, шарнирные соединения с ограниченным углом поворота.

  • Мягкие и жесткие ограничения Можно настроить мягкость (softness), демпфирование (damping) и упругость (restitution) как для линейного, так и для углового движения, создавая более реалистичную физику.

Создание btSliderConstraint

Объект 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 для минимизации вычислений.
  • Настраивать демпфирование и мягкость ограничений, чтобы уменьшить нестабильность и дрожание при высокой частоте кадров.

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

После создания и настройки ограничения необходимо добавить его в физический мир:

physicsWorld.addConstraint(slider, true);

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


btSliderConstraint сочетает в себе гибкость и точность для моделирования скользящих механизмов и направляющих конструкций. Возможность задавать линейные и угловые пределы, а также моторы и демпфирование делает его универсальным инструментом для динамических симуляций в Ammo.js.