Точка приложения силы в мировых и локальных координатах

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

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

Применение силы в мировой системе координат

Метод applyForce позволяет воздействовать на тело с заданной силой в определенной точке. Синтаксис:

body.applyForce(forceVec3, pointVec3);
  • forceVec3 — объект OIMO.Vec3, задающий силу в мировой системе координат.
  • pointVec3 — точка приложения силы в мировой системе координат.

Пример:

let force = new OIMO.Vec3(0, 10, 0);
let point = new OIMO.Vec3(1, 0, 0);
body.applyForce(force, point);

В этом примере сила направлена вертикально вверх, а точка приложения смещена на 1 единицу вдоль оси X от центра объекта. Такая точка приложения создаст вращательный момент, если она не совпадает с центром масс.

Применение силы в локальной системе координат

Для работы с локальными координатами необходимо преобразовать локальную точку в мировую систему. Это достигается с помощью ориентации тела (rotation) и позиции (position):

let localPoint = new OIMO.Vec3(1, 0, 0);
let worldPoint = body.getWorldPoint(localPoint);
body.applyForce(force, worldPoint);

Метод getWorldPoint выполняет матричное преобразование локальной точки в мировую систему координат с учетом текущей ориентации тела.

Аналогично, для локальных сил необходимо преобразовать их к мировой системе:

let localForce = new OIMO.Vec3(0, 10, 0);
let worldForce = body.getWorldVector(localForce);
body.applyForce(worldForce, worldPoint);

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

Рычаги и моменты

Применение силы вне центра масс создает момент силы, влияющий на вращение тела. Момент вычисляется по формуле:

[ = ( - ) ]

где:

  • () — точка приложения силы (мировые координаты),
  • () — центр масс тела,
  • () — вектор силы.

Oimo.js автоматически учитывает этот момент при вызове applyForce, если точка приложения не совпадает с центром масс.

Силы и импульсы

Помимо applyForce, существует applyImpulse, позволяющий мгновенно изменить скорость тела:

body.applyImpulse(impulseVec3, pointVec3);

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

Практические рекомендации

  • Для линейного движения силой по оси используйте точку приложения в центре масс.
  • Для вращения используйте смещенные точки приложения, рассчитывая направление силы.
  • Всегда различайте локальные и мировые системы координат при программировании поведения.

Методы getWorldPoint и getWorldVector являются ключевыми для правильного применения сил в локальной системе координат, особенно при сложных ориентациях объектов.

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