Цилиндрический сустав: CylinderJoint

Цилиндрический сустав в библиотеке Oimo.js представляет собой комбинацию поворотного и поступательного соединения, позволяя объекту вращаться вокруг одной оси и одновременно перемещаться вдоль этой же оси. Он используется для моделирования реальных механизмов, таких как поршни, тележки на рельсах или шестерни с осевым ходом.

Основные свойства CylinderJoint

  • body1 и body2 — два объекта RigidBody, которые соединяются суставом.
  • localAnchor1 и localAnchor2 — точки крепления на телах относительно их локальных координат. Эти точки определяют, где сустав «входит» в тело.
  • localAxis1 и localAxis2 — оси, вокруг которых разрешено вращение и перемещение. Обычно задаются единичным вектором.
  • allowRotation — флаг, разрешающий или запрещающий вращение вокруг оси.
  • allowTranslation — флаг, разрешающий или запрещающий движение вдоль оси.
  • minTranslation / maxTranslation — ограничения перемещения вдоль оси.
  • motorSpeed — скорость мотора, если он активирован.
  • motorForce / translationMotorForce — максимальная сила мотора для вращения и поступательного движения.

Создание цилиндрического сустава

Для создания цилиндрического сустава используется конструктор:

let joint = new OIMO.CylinderJoint({
    body1: box1,
    body2: box2,
    localAnchor1: new OIMO.Vec3(0, 1, 0),
    localAnchor2: new OIMO.Vec3(0, -1, 0),
    localAxis1: new OIMO.Vec3(0, 1, 0),
    localAxis2: new OIMO.Vec3(0, 1, 0),
    allowRotation: true,
    allowTranslation: true,
    minTranslation: 0,
    maxTranslation: 5
});
world.addJoint(joint);
  • body1 и body2 связывают два объекта физики.
  • localAnchor1 / localAnchor2 устанавливают точки соединения в локальных координатах тел.
  • localAxis1 / localAxis2 задают направление движения и вращения.

Если необходимо запретить вращение или движение вдоль оси, устанавливаются соответствующие флаги allowRotation и allowTranslation в false.

Ограничения и диапазоны

Цилиндрический сустав позволяет точно контролировать диапазон перемещения и вращения:

  • minTranslation и maxTranslation ограничивают линейное смещение.
  • rotationLimit используется для ограничения угла вращения вокруг оси (значения в радианах).
  • motor может применяться для управления движением с заданной скоростью и силой.

Пример ограничения перемещения:

joint.setLimits({
    minTranslation: 0,
    maxTranslation: 3
});

Пример ограничения вращения:

joint.setRotationLimits({
    minRotation: -Math.PI / 4,
    maxRotation: Math.PI / 4
});

Моторизация цилиндрического сустава

Моторизация позволяет автоматизировать движение:

  • translationMotor — управляет поступательным движением вдоль оси.
  • rotationMotor — управляет вращением вокруг оси.

Пример включения мотора:

joint.enableMotor(true);
joint.setMotorSpeed(2); // скорость вращения
joint.setMotorForce(10); // сила мотора

Для линейного мотора:

joint.enableTranslationMotor(true);
joint.setTranslationMotorSpeed(1); // скорость вдоль оси
joint.setTranslationMotorForce(20); // максимальная сила

Практические советы

  1. Выравнивание осей Для корректной работы цилиндрического сустава важно, чтобы локальные оси на обоих телах совпадали по направлению. Несовпадение приведет к нестабильной физике.

  2. Баланс ограничения и силы мотора Если мотор слишком сильный, а пределы движения жестко установлены, сустав может «дребезжать» или прыгать, особенно при больших массах тел.

  3. Использование в цепочках механизмов CylinderJoint часто применяют вместе с другими суставами (hinge, slider), создавая сложные кинематические цепочки.

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

Визуализация и отладка

Для отладки цилиндрического сустава можно визуально отображать ось и пределы движения:

const start = joint.getPosition();
const end = joint.getPosition().add(joint.getAxis().scale(joint.maxTranslation));
drawLine(start, end, 0xff0000);

Это позволяет контролировать фактическое расположение суставов и предотвращает неожиданные физические артефакты.

Заключение по возможностям

CylinderJoint — универсальный инструмент для моделирования комбинированного движения в Oimo.js. Он подходит для механизмов с вращением и поступательным движением по одной оси, позволяет точно настраивать ограничения, скорости и силы, а также интегрируется с другими типами суставов для создания сложных систем. Такой сустав является ключевым элементом при проектировании реалистичной физики в 3D-сценах на JavaScript.