Концепция суставов в физическом движке

Библиотека Oimo.js предоставляет инструменты для симуляции физики тел в 3D-пространстве, включая возможность создания сложных систем с помощью суставов (joints). Суставы служат для ограничения движения тел относительно друг друга и моделирования механических соединений, таких как петли, пружины или шестерни.

В Oimo.js суставы реализованы через объекты типа OIMO.Joint, которые связывают два тела (OIMO.RigidBody) и накладывают на них ограничения движения и вращения. Каждый сустав имеет тип, набор параметров, а также методы для управления силой и скоростью.


Типы суставов

  1. DistanceJoint (дистанционный сустав) Ограничивает расстояние между двумя точками на телах. Полезен для моделирования пружин и тросов. Ключевые свойства:

    • distance: фиксированное расстояние между телами.
    • frequencyHz: частота колебаний (для пружинного эффекта).
    • dampingRatio: коэффициент демпфирования колебаний.
  2. HingeJoint (шарнир или петля) Позволяет телам вращаться вокруг одной оси, ограничивая остальные степени свободы. Часто используется для дверей, колёс и суставов роботов. Ключевые свойства:

    • axis: вектор оси вращения.
    • limitEnabled: включение ограничения угла.
    • lowerLimit / upperLimit: минимальный и максимальный угол вращения.
    • motorEnabled: включение мотора для активного вращения.
    • motorSpeed / maxMotorTorque: скорость мотора и максимальный крутящий момент.
  3. BallJoint (шаровой сустав) Обеспечивает вращение вокруг всех осей, как шаровое соединение. Полезен для плеч, колен и подвесок. Ключевые свойства:

    • limitCone: ограничение конусом для предотвращения чрезмерного вращения.
    • spring: настройка пружинного эффекта для возврата в исходное положение.
  4. SliderJoint (слайдер или направляющий сустав) Позволяет телу перемещаться вдоль одной оси с ограничением вращения. Ключевые свойства:

    • axis: направление движения.
    • translationLimitsEnabled: включение ограничений перемещения.
    • lowerTranslation / upperTranslation: минимальное и максимальное смещение.
    • motorEnabled / motorSpeed / maxMotorForce: активное движение по оси.
  5. 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 автоматически рассчитывает силы и моменты, необходимые для поддержания ограничений. При изменении положения одного тела сустав передаёт силы второму телу с учётом массы, инерции и демпфирования.

Параметры демпфирования и частоты позволяют моделировать мягкие соединения: пружины будут колебаться, но постепенно останавливаться, что делает движение более реалистичным.


Ограничения и моторы

  • Ограничения (limits) предотвращают превышение физически допустимых положений или углов. Включаются через флаги limitEnabled, translationLimitsEnabled или coneLimitEnabled.
  • Моторы (motors) активируют движение суставов. Могут использоваться для привода колёс, роботов или имитации активных систем. Параметры мотора контролируют скорость, силу и направление движения.

Примеры практических применений

  • Подвеска автомобиля: комбинация WheelJoint и SliderJoint.
  • Роботизированная рука: цепочка HingeJoint и BallJoint для имитации локтей и плеч.
  • Мост с тросами: DistanceJoint для натяжения канатов.
  • Дверь с пружинной петлёй: HingeJoint с демпфированием и мотором для автоматического закрывания.

Взаимодействие с телами

Каждый сустав может быть подключён к статическим или динамическим телам, что позволяет создавать как неподвижные опоры, так и полностью подвижные конструкции. Суставы обновляются автоматически при каждом шаге симуляции, что обеспечивает корректное поведение сложных систем.


Настройки производительности

  • Уменьшение числа ступеней интеграции (steps) ускоряет симуляцию, но снижает точность суставов.
  • Использование жёстких ограничений вместо пружинных снижает колебания, но делает движение менее естественным.
  • Сложные цепочки суставов требуют тщательного балансирования массы и демпфирования, чтобы избежать нестабильности.

Методы управления суставами

  • enableMotor(boolean): включение или отключение мотора.
  • setLimits(lower, upper): динамическое изменение ограничений.
  • setMotorSpeed(speed): настройка скорости мотора во время симуляции.
  • setSpring(frequency, damping): регулировка пружинного эффекта.

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


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