btGeneric6DofConstraint — это универсальный тип ограничения, обеспечивающий шесть степеней свободы между двумя телами: три трансляции и три вращения. Данный класс позволяет гибко настраивать ограничения движения, задавая диапазоны допустимых перемещений и вращений. Он применяется для создания шарнирных соединений, поршневых механизмов, роботизированных суставов и других сложных кинематических систем.
Для создания ограничителя btGeneric6DofConstraint используется конструктор:
let constraint = new Ammo.btGeneric6DofConstraint(
bodyA, // Первое физическое тело
bodyB, // Второе физическое тело
frameInA, // Локальная матрица тела A
frameInB, // Локальная матрица тела B
useLinearReferenceFrameA // Булево значение, влияет на ориентацию линейных ограничений
);
Параметры:
bodyA и bodyB — экземпляры
Ammo.btRigidBody, соединяемые ограничением.frameInA и frameInB —
Ammo.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);
Эти параметры позволяют имитировать пружинные соединения и гибкие механизмы, сохраняя при этом стабильность симуляции.
btGeneric6DofConstraint предоставляет методы для контроля текущего состояния соединения:
let linearPos = constraint.getLinearPos(); // btVector3
let angularPos = constraint.getAngularPos(); // btVector3
linearPos — текущие смещения между телами.angularPos — текущие углы поворота.Эти значения полезны для визуализации, отладки и применения пользовательской логики.
После создания ограничение необходимо добавить в мир физики:
physicsWorld.addConstraint(constraint, disableCollisionsBetweenLinkedBodies);
disableCollisionsBetweenLinkedBodies — если
true, столкновения между телами, соединенными ограничением,
отключаются. Это предотвращает нежелательные реакции в механизмах с
плотным соединением.disableCollisionsBetweenLinkedBodies при
большом количестве соединений.btGeneric6DofConstraint обеспечивает полный контроль над движением тел в шести измерениях и является ключевым инструментом для сложной физической симуляции в Ammo.js. Гибкость настройки линейных и угловых ограничений позволяет реализовывать как жесткие механические соединения, так и мягкие динамические системы с пружинами и демпфированием.