В физическом моделировании с помощью 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());
x(), y(),
z() для получения компонент.set*Velocity не влияет на движение тела, так как объект
btVector3, возвращаемый геттером, является копией
внутреннего состояния.Линейная и угловая скорость тесно связаны с массой и моментом инерции тела:
В Ammo.js тензор инерции автоматически рассчитывается при создании
тела через btRigidBodyConstructionInfo. Для нестандартных
форм тел можно задавать его вручную через setMassProps.
Для стабилизации симуляции часто применяются ограничители скорости и демпфирование:
// Линейное и угловое демпфирование
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. Такая комбинация часто используется для имитации движения транспортных средств или вращающихся платформ.
Линейная и угловая скорость — фундаментальные инструменты управления движением в Ammo.js, позволяющие точно моделировать физику объектов, управлять динамикой и создавать реалистичные эффекты столкновений и вращений.