Методы applyForce, applyImpulse, applyTorque

Библиотека Oimo.js предоставляет мощный физический движок для работы с трехмерной динамикой тел. Методы applyForce, applyImpulse и applyTorque позволяют напрямую воздействовать на объекты, управляя их движением и вращением. Эти методы относятся к объектам типа RigidBody и используются для реализации сложной физики, включая столкновения, ускорения и крутящие моменты.


applyForce(force: Vec3, point?: Vec3)

Метод applyForce применяет постоянную силу к телу. Основные характеристики:

  • force — вектор силы в мировых координатах. Используется тип Vec3.
  • point — опциональный аргумент, точка приложения силы в мировых координатах. Если не указан, сила применяется к центру масс.

Применение силы приводит к изменению ускорения тела по формуле:

[ = ]

где (m) — масса тела. Если точка приложения отличается от центра масс, возникает вращательный момент, влияющий на угловую скорость тела.

Пример использования:

const force = new OIMO.Vec3(0, 10, 0); // сила вверх
const point = new OIMO.Vec3(1, 0, 0);  // точка приложения
rigidBody.applyForce(force, point);

Особенности применения:

  • Сила применяется на каждый шаг симуляции, пока вызывается метод.
  • Если нужно одноразовое ускорение, следует использовать applyImpulse.

applyImpulse(impulse: Vec3, point?: Vec3)

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

  • impulse — вектор импульса в мировых координатах. Величина импульса определяется как ( = = m ).
  • point — точка приложения импульса. Если не указана, импульс применяется к центру масс.

Мгновенное изменение скорости:

[ = ]

Если точка приложения смещена относительно центра масс, возникает угловое ускорение:

[ += I^{-1} ( )]

где (I^{-1}) — обратная тензорная матрица инерции, () — радиус-вектор от центра масс до точки приложения.

Пример использования:

const impulse = new OIMO.Vec3(5, 0, 0);
rigidBody.applyImpulse(impulse);

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


applyTorque(torque: Vec3)

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

  • torque — вектор момента сил в мировых координатах.

Изменение угловой скорости вычисляется через:

[ = I^{-1} ]

где (I^{-1}) — обратная матрица инерции, () — вектор крутящего момента.

Пример использования:

const torque = new OIMO.Vec3(0, 10, 0); // вращение вокруг оси Y
rigidBody.applyTorque(torque);

Особенности применения:

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

Взаимодействие методов

  1. Комбинирование сил и импульсов:

    • applyForce добавляет постоянное ускорение.
    • applyImpulse изменяет скорость мгновенно.
    • Можно комбинировать для моделирования гравитации, столкновений и управляющих воздействий.
  2. Сила вне центра масс:

    • При приложении force или impulse вне центра масс автоматически возникает вращение.
    • Позволяет создавать реалистичные эффекты падений и отскоков.
  3. Torque как альтернативный способ вращения:

    • Вместо смещения точки приложения силы можно напрямую управлять вращением с помощью applyTorque.
    • Упрощает реализацию моторных механизмов и вращающихся объектов.

Рекомендации по использованию

  • Для симуляций с постоянными воздействиями — использовать applyForce.
  • Для одноразовых событий — использовать applyImpulse.
  • Для чистого вращения без линейного движения — использовать applyTorque.
  • Внимательно следить за массой и распределением инерции тела, так как они напрямую влияют на отклик методов.
  • При высокой частоте вызовов следить за численной стабильностью, особенно при больших силах или моментах.

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