btGeneric6DofConstraint: общие 6 степеней свободы

btGeneric6DofConstraint — это универсальный тип ограничения, обеспечивающий шесть степеней свободы между двумя телами: три трансляции и три вращения. Данный класс позволяет гибко настраивать ограничения движения, задавая диапазоны допустимых перемещений и вращений. Он применяется для создания шарнирных соединений, поршневых механизмов, роботизированных суставов и других сложных кинематических систем.


Создание и инициализация

Для создания ограничителя btGeneric6DofConstraint используется конструктор:

let constraint = new Ammo.btGeneric6DofConstraint(
    bodyA,                 // Первое физическое тело
    bodyB,                 // Второе физическое тело
    frameInA,              // Локальная матрица тела A
    frameInB,              // Локальная матрица тела B
    useLinearReferenceFrameA // Булево значение, влияет на ориентацию линейных ограничений
);

Параметры:

  • bodyA и bodyB — экземпляры Ammo.btRigidBody, соединяемые ограничением.
  • frameInA и frameInBAmmo.btTransform, задающие локальные системы координат ограничения относительно каждого тела.
  • useLinearReferenceFrameA — если true, линейные ограничения рассчитываются в системе координат тела A; если false, в глобальной системе.

Локальные трансформы определяют, где именно на телах будет точка соединения и ориентация осей ограничения. Правильная настройка этих матриц критична для корректной симуляции.


Линейные и угловые ограничения

btGeneric6DofConstraint разделяет ограничения на трансляционные и вращательные. Каждое направление можно ограничить независимо, задав минимальные и максимальные значения.

Линейные ограничения

constraint.setLinearLowerLimit(new Ammo.btVector3(xMin, yMin, zMin));
constraint.setLinearUpperLimit(new Ammo.btVector3(xMax, yMax, zMax));
  • xMin, yMin, zMin — минимальные смещения по осям.
  • xMax, yMax, zMax — максимальные смещения.

Если минимальное и максимальное значение по оси равны, движение полностью заблокировано.

Вращательные ограничения

constraint.setAngularLowerLimit(new Ammo.btVector3(rotXMin, rotYMin, rotZMin));
constraint.setAngularUpperLimit(new Ammo.btVector3(rotXMax, rotYMax, rotZMax));
  • Углы задаются в радианах.
  • Можно ограничить вращение полностью, установив одинаковые нижние и верхние границы.
  • Используются для создания шарниров, приводов и механических стопоров.

Мягкие ограничения и силы

btGeneric6DofConstraint поддерживает мягкие ограничения с использованием функций линейной и угловой демпфирующей силы:

constraint.setStiffness(linearStiffness, angularStiffness);
constraint.setDamping(linearDamping, angularDamping);
  • Stiffness — коэффициент жесткости ограничения; при больших значениях тела почти не уходят за пределы допустимого диапазона.
  • Damping — демпфирование, сглаживающее колебания и предотвращающее «дрожание» соединений.

Эти параметры позволяют имитировать пружинные соединения и гибкие механизмы, сохраняя при этом стабильность симуляции.


Получение информации о текущем состоянии

btGeneric6DofConstraint предоставляет методы для контроля текущего состояния соединения:

let linearPos = constraint.getLinearPos();    // btVector3
let angularPos = constraint.getAngularPos();  // btVector3
  • linearPos — текущие смещения между телами.
  • angularPos — текущие углы поворота.

Эти значения полезны для визуализации, отладки и применения пользовательской логики.


Использование с World

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

physicsWorld.addConstraint(constraint, disableCollisionsBetweenLinkedBodies);
  • disableCollisionsBetweenLinkedBodies — если true, столкновения между телами, соединенными ограничением, отключаются. Это предотвращает нежелательные реакции в механизмах с плотным соединением.

Примеры применения

  1. Поршневой механизм — ограничение движения одного тела вдоль оси с минимальным и максимальным смещением, блокируя вращение.
  2. Шарнирный сустав — вращение разрешено только вокруг одной оси, остальные блокируются.
  3. Пружинные соединения — использование мягких ограничений с демпфированием для имитации упругости.

Настройка и тонкая оптимизация

  • Локальные оси должны совпадать с предполагаемыми направлениями движения. Любое несоответствие приводит к аномальным рывкам.
  • Широкие диапазоны делают симуляцию менее стабильной; лучше разбивать сложные механизмы на несколько отдельных ограничений.
  • Жесткость и демпфирование регулируются экспериментально в зависимости от массы и скорости тел.

Рекомендации по производительности

  • Использовать disableCollisionsBetweenLinkedBodies при большом количестве соединений.
  • Ограничивать количество мягких ограничений на сцену, так как вычисления демпфирования добавляют нагрузку.
  • Минимизировать использование одновременного вращения и линейного движения в высокоскоростных механизмах.

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