Библиотека Oimo.js предоставляет инструменты для симуляции физики тел в 3D-пространстве, включая возможность создания сложных систем с помощью суставов (joints). Суставы служат для ограничения движения тел относительно друг друга и моделирования механических соединений, таких как петли, пружины или шестерни.
В Oimo.js суставы реализованы через объекты типа
OIMO.Joint, которые связывают два тела
(OIMO.RigidBody) и накладывают на них ограничения движения
и вращения. Каждый сустав имеет тип, набор
параметров, а также методы для управления силой и
скоростью.
DistanceJoint (дистанционный сустав) Ограничивает расстояние между двумя точками на телах. Полезен для моделирования пружин и тросов. Ключевые свойства:
distance: фиксированное расстояние между телами.frequencyHz: частота колебаний (для пружинного
эффекта).dampingRatio: коэффициент демпфирования колебаний.HingeJoint (шарнир или петля) Позволяет телам вращаться вокруг одной оси, ограничивая остальные степени свободы. Часто используется для дверей, колёс и суставов роботов. Ключевые свойства:
axis: вектор оси вращения.limitEnabled: включение ограничения угла.lowerLimit / upperLimit: минимальный и
максимальный угол вращения.motorEnabled: включение мотора для активного
вращения.motorSpeed / maxMotorTorque: скорость
мотора и максимальный крутящий момент.BallJoint (шаровой сустав) Обеспечивает вращение вокруг всех осей, как шаровое соединение. Полезен для плеч, колен и подвесок. Ключевые свойства:
limitCone: ограничение конусом для предотвращения
чрезмерного вращения.spring: настройка пружинного эффекта для возврата в
исходное положение.SliderJoint (слайдер или направляющий сустав) Позволяет телу перемещаться вдоль одной оси с ограничением вращения. Ключевые свойства:
axis: направление движения.translationLimitsEnabled: включение ограничений
перемещения.lowerTranslation / upperTranslation:
минимальное и максимальное смещение.motorEnabled / motorSpeed /
maxMotorForce: активное движение по оси.WheelJoint Специальный сустав для колёс, объединяющий вращение и подвеску. Используется в симуляции транспортных средств.
Сустав создаётся через конструктор соответствующего типа, например:
let hinge = new OIMO.HingeJoint(
bodyA, // первое тело
bodyB, // второе тело
{
pivotA: new OIMO.Vec3(0, 1, 0),
pivotB: new OIMO.Vec3(0, -1, 0),
axis: new OIMO.Vec3(0, 0, 1),
lowerLimit: -Math.PI/4,
upperLimit: Math.PI/4,
motorEnabled: true,
motorSpeed: 2,
maxMotorTorque: 10
}
);
Особенности:
pivotA и pivotB задают точки крепления на
телах в локальных координатах.axis определяет направление оси вращения или
движения.Суставы управляют силовыми взаимодействиями между телами, а Oimo.js автоматически рассчитывает силы и моменты, необходимые для поддержания ограничений. При изменении положения одного тела сустав передаёт силы второму телу с учётом массы, инерции и демпфирования.
Параметры демпфирования и частоты позволяют моделировать мягкие соединения: пружины будут колебаться, но постепенно останавливаться, что делает движение более реалистичным.
limitEnabled, translationLimitsEnabled или
coneLimitEnabled.WheelJoint и
SliderJoint.HingeJoint и
BallJoint для имитации локтей и плеч.DistanceJoint для натяжения
канатов.HingeJoint с демпфированием и
мотором для автоматического закрывания.Каждый сустав может быть подключён к статическим или динамическим телам, что позволяет создавать как неподвижные опоры, так и полностью подвижные конструкции. Суставы обновляются автоматически при каждом шаге симуляции, что обеспечивает корректное поведение сложных систем.
steps) ускоряет
симуляцию, но снижает точность суставов.enableMotor(boolean): включение или отключение
мотора.setLimits(lower, upper): динамическое изменение
ограничений.setMotorSpeed(speed): настройка скорости мотора во
время симуляции.setSpring(frequency, damping): регулировка пружинного
эффекта.Эти методы позволяют динамически изменять поведение суставов в процессе симуляции, что важно для игровых и инженерных приложений.
Суставы в Oimo.js образуют основу сложной физической симуляции, позволяя создавать механизмы с точной контролируемой динамикой, от простых пружин до многоуровневых робототехнических конструкций.