В 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, включая перенос сил на сложные сцены с вращающимися или движущимися телами.