Шарнирный сустав: RevoluteJoint

RevoluteJoint — это тип шарнирного соединения, который позволяет двум телам вращаться относительно общей оси, как дверная петля или ось колеса. В Oimo.js данный тип соединения реализован через объект OIMO.RevoluteJoint, который управляет ограничениями движения и моментами сил между двумя RigidBody.


Создание RevoluteJoint

Для создания шарнирного соединения необходимы два тела (RigidBody) и параметры, определяющие положение и ориентацию оси вращения:

const joint = new OIMO.RevoluteJoint({
    body1: box1,            // Первое тело
    body2: box2,            // Второе тело
    position: new OIMO.Vec3(0, 1, 0),  // Положение точки соединения
    axis: new OIMO.Vec3(0, 1, 0),      // Направление оси вращения
    lowerLimit: -Math.PI/4,  // Минимальный угол вращения
    upperLimit: Math.PI/4,   // Максимальный угол вращения
    enableLimit: true         // Включение ограничений углов
});
world.addJoint(joint);

Ключевые параметры:

  • body1, body2 — тела, которые соединяются.
  • position — точка в глобальных координатах, где соединение фиксируется.
  • axis — направление вращения. Должно быть нормализованным.
  • lowerLimit и upperLimit — ограничения угла вращения.
  • enableLimit — включение или отключение ограничений вращения.
  • motor и motorSpeed — опции для создания приводного вращения.

Настройка ограничений и двигателя

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

joint.enableLimit = true;
joint.lowerLimit = -Math.PI / 6; // -30 градусов
joint.upperLimit = Math.PI / 6;  // 30 градусов

Двигатель (Motor) позволяет задавать скорость вращения и силу, с которой тело будет двигаться:

joint.enableMotor = true;
joint.motorSpeed = Math.PI;  // Радианы в секунду
joint.maxMotorTorque = 10;   // Максимальный крутящий момент

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


Обновление и симуляция

После добавления RevoluteJoint в мир (world), Oimo.js автоматически учитывает его при расчете сил и коллизий:

function animate() {
    world.step(); // Обновление физики
    renderer.render(scene, camera);
    requestAnimationFrame(animate);
}
animate();

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


Применение RevoluteJoint

  1. Механизмы с вращающимися частями — двери, люки, колеса.
  2. Робототехника — суставы манипуляторов.
  3. Физические симуляции — маятники, ворота, качели.

При проектировании механизма важно правильно настроить ось вращения, иначе вращение будет некорректным или соединение начнет вести себя нестабильно. Ось должна проходить через точку соединения и соответствовать ожидаемой геометрии.


Советы по стабильности

  • Всегда использовать нормализованные векторы оси (axis.normalize()).
  • Избегать пересечения тел в момент создания соединения.
  • Для сложных систем соединений комбинировать RevoluteJoint с другими типами, например, DistanceJoint для контроля положения.
  • Настраивать maxMotorTorque разумно, чтобы не возникало чрезмерных ускорений.

Взаимодействие с другими типами Joint

RevoluteJoint может комбинироваться с:

  • PrismaticJoint — позволяет ограничивать движение вдоль оси.
  • DistanceJoint — фиксирует расстояние между точками на двух телах.
  • SphericalJoint — добавляет свободу вращения во всех направлениях.

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


Пример сложного соединения

const wheel = createWheel();
const axle = createAxle();

const wheelJoint = new OIMO.RevoluteJoint({
    body1: axle,
    body2: wheel,
    position: wheel.position.clone(),
    axis: new OIMO.Vec3(0, 0, 1),
    enableMotor: true,
    motorSpeed: 5,
    maxMotorTorque: 20
});
world.addJoint(wheelJoint);

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