Применение сил, импульсов и крутящих моментов

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

Применение силы (applyForce)

Сила в Oimo.js прикладывается к телу через метод applyForce(forceVec3, relativePoint). Параметры:

  • forceVec3 – вектор силы в мировых координатах.
  • relativePoint – точка приложения силы относительно центра масс тела. Если не указана, сила действует в центре масс.

Пример применения силы к телу:

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

Сила, приложенная вне центра масс, вызывает не только линейное ускорение, но и вращение тела.

Импульс (applyImpulse)

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

rigidBody.applyImpulse(impulseVec3, relativePoint);
  • impulseVec3 – вектор импульса (масса × изменение скорости).
  • relativePoint – точка приложения относительно центра масс.

Применение импульса эффективно для имитации ударов и стартового ускорения тел.

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

Крутящий момент (applyTorque)

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

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

Крутящий момент особенно удобен для симуляции моторов, вентиляторов или вращающихся объектов.


Расчёт точек приложения силы и импульса

Выбор точки приложения критически важен для точного физического поведения:

  • Центр масс: линейное движение без вращения.
  • Вне центра масс: линейное движение + вращение.

В Oimo.js координаты точки могут быть заданы в локальной системе тела или мировой системе. Для конверсии используют методы:

const worldPoint = rigidBody.getWorldPoint(localPoint);
const localPoint = rigidBody.getLocalPoint(worldPoint);

Взаимодействие нескольких сил

Если к телу одновременно приложено несколько сил:

  • Результирующая сила = векторная сумма всех сил.
  • Результирующий крутящий момент = сумма моментов относительно центра масс.

Пример сложения сил и моментов:

const force1 = new OIMO.Vec3(10, 0, 0);
const force2 = new OIMO.Vec3(0, 20, 0);

rigidBody.applyForce(force1, new OIMO.Vec3(1, 0, 0));
rigidBody.applyForce(force2, new OIMO.Vec3(-1, 0, 0));

В результате тело будет двигаться по диагонали и вращаться из-за смещённой точки приложения.


Связь силы, импульса и массы

Согласно закону Ньютона:

[ F = m a a = ]

Импульс:

[ v = J ]

Таким образом:

  • Сила изменяет скорость постепенно.
  • Импульс изменяет скорость мгновенно.

Масса тела напрямую влияет на чувствительность к этим воздействиям.


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

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

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