Линейная и угловая скорость

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


Линейная скорость

Линейная скорость описывает перемещение центра масс тела в пространстве. В Oimo.js она представлена в виде вектора Vec3, где каждая компонента указывает скорость по соответствующей оси:

let linearVelocity = body.linearVelocity;
console.log(linearVelocity.x, linearVelocity.y, linearVelocity.z);
  • linearVelocity.x — скорость вдоль оси X.
  • linearVelocity.y — скорость вдоль оси Y.
  • linearVelocity.z — скорость вдоль оси Z.

Установка линейной скорости позволяет мгновенно изменить движение тела:

body.linearVelocity.set(5, 0, 0); // движение вправо со скоростью 5

Линейная скорость вычисляется на основе силы, приложенной к телу, и его массы. Формула из классической механики:

[ = + ]

где:

  • () — текущая линейная скорость,
  • () — приложенная сила,
    1. — масса тела,
  • (t) — шаг симуляции,
  • () — предыдущая скорость.

Важно учитывать, что при столкновениях и контактах с другими телами Oimo.js автоматически обновляет linearVelocity с учётом импульсов и трения.


Угловая скорость

Угловая скорость описывает вращение тела вокруг его центра масс. В Oimo.js она также представлена объектом Vec3, где каждая компонента определяет скорость вращения вокруг соответствующей оси:

let angularVelocity = body.angularVelocity;
console.log(angularVelocity.x, angularVelocity.y, angularVelocity.z);
  • angularVelocity.x — вращение вокруг оси X.
  • angularVelocity.y — вращение вокруг оси Y.
  • angularVelocity.z — вращение вокруг оси Z.

Угловая скорость может быть установлена напрямую:

body.angularVelocity.set(0, 1, 0); // вращение вокруг оси Y

Физически угловая скорость вычисляется на основе момента силы и момента инерции тела:

[ = I^{-1} t + ]

где:

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

Тензор инерции учитывает форму и распределение массы тела, что делает вращение реалистичным.


Взаимосвязь линейной и угловой скорости

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

[ v = r ]

где:

    1. — скорость центра масс,
    1. — радиус цилиндра,
  • () — угловая скорость.

В Oimo.js можно реализовать это напрямую через joint или constraint, чтобы синхронизировать вращение и перемещение тел.


Практические методы работы

  1. Чтение скоростей: Для анализа движения тела:
console.log(body.linearVelocity.length()); // скорость движения
console.log(body.angularVelocity.length()); // скорость вращения
  1. Управление движением: При анимации или игровой логике часто требуется менять скорости программно:
body.linearVelocity.add(new OIMO.Vec3(0, 5, 0)); // импульс вверх
body.angularVelocity.scale(0.5); // замедление вращения
  1. Взаимодействие с физикой мира: Любая сила, импульс или трение автоматически корректируют линейную и угловую скорость, поэтому ручное вмешательство должно учитывать текущие значения.

Ограничения и тонкости

  • Oimo.js использует explicit Euler интегратор, что может приводить к накоплению ошибок при больших шагах симуляции. Рекомендуется шаг deltaTime ≤ 1/60.
  • Для объектов с большой массой или сложной геометрией угловая скорость может вести себя нестабильно при столкновениях. Решение — корректная настройка inertia и friction.
  • Линейная и угловая скорости в Oimo.js выражены в метрах в секунду и радианах в секунду, что важно учитывать при расчётах.

Инструменты визуализации

Для отладки динамики удобно визуализировать скорости:

let arrowHelper = new THREE.ArrowHelper(
    linearVelocity.clone().normalize(),
    body.getPosition(),
    linearVelocity.length(),
    0xff0000
);
scene.add(arrowHelper);

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


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