Блокировка осей вращения и перемещения

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

Блокировка осей используется в двух основных аспектах:

  1. Линейное движение — ограничение перемещения объекта по осям X, Y или Z.
  2. Угловое движение — ограничение вращения объекта вокруг одной или нескольких осей.

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

Для ограничения перемещения тела используется свойство linearLock. Оно принимает объект с булевыми значениями для каждой из осей:

let body = world.add({
    type: 'box',
    size: [1, 1, 1],
    pos: [0, 5, 0],
    move: true
});

body.linearLock = { x: true, y: false, z: true };

Пояснение:

  • x: true — запрещает перемещение по оси X.
  • y: false — разрешает свободное движение по оси Y.
  • z: true — запрещает перемещение по оси Z.

При такой конфигурации объект будет двигаться только вверх или вниз по оси Y, игнорируя попытки смещения по горизонтали.

Настройка блокировки вращения

Для ограничения вращения применяется свойство angularLock, также представляющее объект с булевыми значениями для каждой оси:

body.angularLock = { x: true, y: false, z: true };

Пояснение:

  • x: true — объект не может вращаться вокруг оси X.
  • y: false — вращение вокруг оси Y разрешено.
  • z: true — запрещено вращение вокруг оси Z.

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

Комбинирование линейной и угловой блокировки

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

body.linearLock = { x: true, y: false, z: true };
body.angularLock = { x: true, y: true, z: true };

В этом примере объект свободно перемещается только по оси Y, но полностью зафиксирован по вращению во всех направлениях.

Динамическое изменение блокировок

Oimo.js позволяет изменять блокировки тела во время выполнения симуляции, что полезно для анимации или интерактивных сцен:

setTimeout(() => {
    body.linearLock.x = false;
    body.angularLock.y = false;
}, 2000);

После двух секунд объект сможет двигаться по оси X и вращаться вокруг оси Y, сохраняя прежние ограничения по другим направлениям.

Влияние на физическую симуляцию

Блокировки осей напрямую влияют на расчёт столкновений и силы, действующие на объект.

  • Линейные блокировки предотвращают накопление скорости по запрещённым направлениям.
  • Угловые блокировки предотвращают вращение, но сохраняют способность к взаимодействию с другими телами (удары, столкновения).

Правильная настройка блокировок улучшает стабильность симуляции и снижает вероятность «дрожания» объектов при динамическом взаимодействии.

Использование с различными типами тел

Статические тела (type: 'box', 'sphere', 'cylinder') часто используют полные блокировки вращения и линейного движения для создания стен, пола или платформ.

Динамические тела (move: true) применяют частичные блокировки для имитации ограниченной подвижности, например, маятников, дверей или конвейерных элементов.

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

  • Минимизация блокировок: блокировать только необходимые оси, чтобы сохранить реалистичное поведение.
  • Комбинирование с жесткими соединениями: блокировки хорошо работают вместе с joint-объектами, создавая механизмы и подвески.
  • Тестирование при нагрузках: проверять симуляцию с максимальной массой и силой воздействия, чтобы избежать нестабильности.

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