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

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


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

Линейная скорость (velocity) — векторная величина, описывающая изменение положения тела в пространстве за единицу времени. В Cannon.js каждое тело типа Body имеет свойство velocity:

const sphere = new CANNON.Body({
    mass: 5, 
    shape: new CANNON.Sphere(1)
});

sphere.velocity.set(0, 10, 0);
  • mass — масса тела. Масса напрямую влияет на поведение при столкновениях.
  • velocity.set(x, y, z) — установка компонентов линейной скорости по осям X, Y и Z.

Расчёт линейной скорости при действии силы осуществляется через закон Ньютона:

[ {new} = {old} + t]

где:

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

В Cannon.js применение силы осуществляется через методы:

sphere.applyForce(new CANNON.Vec3(0, 100, 0), sphere.position);
  • Первый аргумент — вектор силы,
  • Второй аргумент — точка приложения силы в локальных координатах тела.

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

Угловая скорость (angularVelocity) описывает вращательное движение тела. Она представляет собой вектор, направление которого совпадает с осью вращения, а длина — скорость вращения в радианах в секунду. В Cannon.js используется аналогичная система:

sphere.angularVelocity.set(0, 5, 0);
  • Установка угловой скорости напрямую задаёт вращение объекта.
  • Для изменения угловой скорости под воздействием момента силы применяется метод:
sphere.applyTorque(new CANNON.Vec3(0, 10, 0));

Момент силы (torque) связан с угловой скоростью через уравнение:

[ {new} = {old} + I^{-1} t]

где:

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

Cannon.js автоматически вычисляет тензор инерции для стандартных форм, таких как сферы, кубы или цилиндры, что упрощает работу с вращением.


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

При столкновениях или контакте с другими телами одновременно изменяются и линейная, и угловая скорости. Для реалистичного моделирования применяются коэффициенты трения и упругости:

sphere.material = new CANNON.Material({
    friction: 0.4,
    restitution: 0.6
});
  • friction влияет на изменение угловой скорости при контакте с поверхностью,
  • restitution — коэффициент упругости, влияющий на скорость отскока.

Cannon.js вычисляет эффекты трения через импульсные силы, которые одновременно корректируют линейную и угловую скорости тела в зависимости от точки контакта и направления силы трения.


Практическое использование

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

  1. Создание мира и тел:
const world = new CANNON.World();
world.gravity.set(0, -9.82, 0);

const box = new CANNON.Body({
    mass: 2,
    shape: new CANNON.Box(new CANNON.Vec3(1, 1, 1))
});
box.position.set(0, 5, 0);
box.velocity.set(1, 0, 0);
box.angularVelocity.set(0, 2, 0);
world.addBody(box);
  1. Обновление мира на каждом шаге:
const timeStep = 1 / 60;
world.step(timeStep);
  1. Обработка столкновений автоматически изменяет свойства velocity и angularVelocity тел.

Рекомендации по оптимизации

  • Для больших сцен важно ограничивать величины скорости, чтобы избежать численных нестабильностей:
body.velocity.clampLength(0, 20);
body.angularVelocity.clampLength(0, 10);
  • Использование фиксированных шагов интеграции (world.step(fixedTimeStep)) обеспечивает предсказуемое поведение линейной и угловой скорости.
  • Настройка damping уменьшает искусственные колебания:
body.linearDamping = 0.01;
body.angularDamping = 0.01;
  • linearDamping — снижение линейной скорости со временем,
  • angularDamping — снижение вращения.

Связь с визуализацией

В графических движках (Three.js или Babylon.js) свойства velocity и angularVelocity Cannon.js применяются для обновления позиции и ориентации объектов:

mesh.position.copy(body.position);
mesh.quaternion.copy(body.quaternion);
  • position соответствует интегрированной линейной скорости,
  • quaternion — угловой скорости, вычисленной через тензор инерции.

Таким образом, Cannon.js обеспечивает тесную интеграцию физических свойств с визуальной симуляцией.

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