PrismaticJoint в Oimo.js представляет собой тип соединения между двумя телами, позволяющий им перемещаться друг относительно друга только вдоль одной определённой оси, исключая вращение. Такой сустав особенно полезен при моделировании поршневых механизмов, направляющих рельсовых систем или шторных конструкций, где движение ограничено прямолинейной траекторией.
PrismaticJoint создаётся с использованием конструктора
OIMO.PrismaticJoint, принимающего два объекта
RigidBody и объект с параметрами конфигурации. Основной
синтаксис выглядит следующим образом:
const joint = new OIMO.PrismaticJoint(bodyA, bodyB, {
localAxis1: new OIMO.Vec3(1, 0, 0),
localAnchor1: new OIMO.Vec3(0, 0, 0),
localAnchor2: new OIMO.Vec3(0, 0, 0),
lowerLimit: -2,
upperLimit: 2,
enableLimit: true,
enableMotor: false,
motorSpeed: 0,
maxMotorForce: 1
});
world.addJoint(joint);
Ключевые параметры:
PrismaticJoint строго фиксирует вращение и позволяет перемещение
только вдоль выбранной оси. Параметры lowerLimit и
upperLimit задают диапазон допустимого перемещения. Если
движение выходит за пределы этих значений, Oimo.js автоматически
корректирует позицию тел, обеспечивая стабильность симуляции.
Пример ограничения движения:
joint.lowerLimit = -1; // минимальное смещение -1 единица
joint.upperLimit = 1; // максимальное смещение +1 единица
joint.enableLimit = true;
При необходимости отключения ограничения достаточно установить
enableLimit = false, тогда сустав станет неограниченным
вдоль оси движения.
PrismaticJoint может управляться мотором для создания активного движения. Мотор воздействует на первое тело, стремясь переместить его относительно второго с заданной скоростью. Мотор полезен для моделирования линейных приводов, подъёмников или автоматических систем.
Настройка мотора:
joint.enableMotor = true;
joint.motorSpeed = 2; // единицы в секунду
joint.maxMotorForce = 10; // максимальная сила воздействия
Если сила, приложенная мотором, превышает maxMotorForce,
движение замедляется или останавливается. При работе мотора ограничения
(lowerLimit и upperLimit) остаются активными и
учитываются при расчёте силы.
PrismaticJoint опирается на локальные координаты тел. Параметр
localAxis1 задаёт ось первого тела, вдоль которой
происходит движение. Oimo.js автоматически вычисляет направление
движения второго тела, исходя из ориентации первого и текущей
позиции.
localAnchor1 и localAnchor2 определяют
точки соединения суставов. Их корректная настройка критически важна для
стабильности: смещённые якоря могут привести к ненужным силам и
вибрациям системы.
Поршневой механизм — тело поршня соединяется с цилиндром через PrismaticJoint, ограничивая движение только вдоль оси цилиндра. Мотор позволяет задавать скорость хода поршня.
Рельсовое движение — вагонетка перемещается вдоль рельсового пути. Призматический сустав исключает вращение и боковые смещения, гарантируя точное прямолинейное движение.
Подъёмник или лифт — соединение кабины и направляющих создаёт стабильное вертикальное перемещение с возможностью ограничения верхнего и нижнего положения.
maxMotorForce позволяет
достичь нужной скорости без дерганий, но слишком большая сила может
вызвать нестабильность.PrismaticJoint часто используется совместно с RevoluteJoint или DistanceJoint для создания сложных механизмов. Например, поршневой шатунный механизм комбинирует вращение коленчатого вала через RevoluteJoint и линейное движение поршня через PrismaticJoint, обеспечивая реалистичную кинематику.
getPosition() — возвращает текущую позицию второго тела
относительно первого вдоль оси.getVelocity() — скорость перемещения вдоль оси.setLimits(lower, upper) — быстро задаёт диапазон
движения.enableMotor(flag) — включает или выключает мотор.setMotor(speed, maxForce) — задаёт параметры
мотора.Эти методы позволяют динамически изменять поведение сустава в процессе симуляции, создавая адаптивные механизмы с переменными ограничениями и активным управлением.
PrismaticJoint является одним из наиболее универсальных и стабильно работающих типов соединений в Oimo.js, обеспечивая точное линейное движение и широкие возможности для моделирования механических систем.