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

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

  • Линейная скорость (linearVelocity) выражается в единицах длины за единицу времени (например, метров в секунду) и задаётся в виде вектора (x, y, z).
  • Угловая скорость (angularVelocity) измеряется в радианах в секунду и также представлена в виде вектора, где направление задаёт ось вращения, а длина вектора — скорость вращения.

Оба параметра являются свойствами объектов типа btRigidBody и напрямую влияют на динамическое поведение объектов в симуляции.


Задание линейной и угловой скорости

В Ammo.js установка скоростей происходит через методы объекта btRigidBody:

// Установка линейной скорости
rigidBody.setLinearVelocity(new Ammo.btVector3(10, 0, 0));

// Установка угловой скорости
rigidBody.setAngularVelocity(new Ammo.btVector3(0, 1, 0));
  • setLinearVelocity принимает объект btVector3, задающий скорость по каждой оси.
  • setAngularVelocity задаёт скорость вращения, направление вектора соответствует оси вращения.

Важно помнить, что эти методы заменяют текущие скорости, а не добавляют их. Для накопления скорости необходимо сначала получить существующую скорость через getLinearVelocity() или getAngularVelocity() и выполнить арифметические операции.


Получение текущих скоростей

Для контроля или анализа динамики объектов применяются методы:

const linVel = rigidBody.getLinearVelocity();
console.log(linVel.x(), linVel.y(), linVel.z());

const angVel = rigidBody.getAngularVelocity();
console.log(angVel.x(), angVel.y(), angVel.z());
  • Возвращаемые объекты — это btVector3, работа с которыми требует вызова методов x(), y(), z() для получения компонент.
  • Прямое изменение компонентов без применения set*Velocity не влияет на движение тела, так как объект btVector3, возвращаемый геттером, является копией внутреннего состояния.

Влияние массы и инерции

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

  • Линейная скорость пропорциональна приложенной силе и обратно пропорциональна массе: [ = ]
  • Угловая скорость определяется приложенным моментом силы и тензором инерции: [ = I^{-1} t]

В Ammo.js тензор инерции автоматически рассчитывается при создании тела через btRigidBodyConstructionInfo. Для нестандартных форм тел можно задавать его вручную через setMassProps.


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

Для стабилизации симуляции часто применяются ограничители скорости и демпфирование:

// Линейное и угловое демпфирование
rigidBody.setDamping(0.1, 0.2);
  • Первый параметр — линейное демпфирование, замедляющее движение.
  • Второй параметр — угловое демпфирование, замедляющее вращение.

Демпфирование предотвращает бесконтрольное ускорение объектов из-за численных ошибок интегратора, особенно при сложных коллизиях.


Взаимодействие с силами и импульсами

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

// Применение линейного импульса
rigidBody.applyCentralImpulse(new Ammo.btVector3(5, 0, 0));

// Применение крутящего момента
rigidBody.applyTorqueImpulse(new Ammo.btVector3(0, 2, 0));
  • applyCentralImpulse мгновенно изменяет линейную скорость пропорционально массе.
  • applyTorqueImpulse мгновенно изменяет угловую скорость согласно моменту инерции.

Использование импульсов позволяет моделировать столкновения, удары, а также реакции на внешние воздействия, сохраняя физическую корректность.


Примеры комбинации линейной и угловой скорости

Сложные сценарии, такие как вращение с движением вперёд, задаются комбинацией обоих типов скорости:

rigidBody.setLinearVelocity(new Ammo.btVector3(0, 0, 10));
rigidBody.setAngularVelocity(new Ammo.btVector3(0, 1, 0));

В этом примере тело одновременно движется вперёд по оси Z и вращается вокруг оси Y. Такая комбинация часто используется для имитации движения транспортных средств или вращающихся платформ.


Практические нюансы

  1. Масштаб сцены: слишком маленькие или большие значения скорости могут привести к нестабильности симуляции из-за ограничений численного интегратора.
  2. Фиксированные объекты: для статических тел скорости не применяются, они игнорируются.
  3. Интегратор: Ammo.js использует импульсный интегратор, поэтому линейная и угловая скорости напрямую отражают изменения от сил и моментов за один шаг симуляции.
  4. Смешение единиц: важно использовать одинаковую систему координат и единиц длины и времени по всей сцене, чтобы скорость и демпфирование работали корректно.

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