Применение крутящего момента: applyTorque

Крутящий момент (torque) — это векторная величина, описывающая вращательное воздействие на твёрдое тело. В библиотеке Cannon.js крутящий момент используется для изменения угловой скорости объекта и моделирования вращения без прямого задания линейной силы.

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

  • угловую скорость (angularVelocity)
  • ориентацию тела (quaternion)
  • гироскопические эффекты
  • поведение сложных механических систем

В Cannon.js крутящий момент применяется к телу через метод applyTorque.


Метод applyTorque

Метод объявлен у объекта Body:

body.applyTorque(torqueVector);

Где:

  • torqueVector — объект CANNON.Vec3
  • вектор задаётся в мировых координатах
  • воздействие накапливается в течение текущего шага симуляции

Пример:

const body = new CANNON.Body({
    mass: 5
});

const torque = new CANNON.Vec3(0, 10, 0);
body.applyTorque(torque);

В данном примере создаётся вращение вокруг оси Y.


Как Cannon.js обрабатывает крутящий момент

Во время шага симуляции (world.step(dt)) происходит:

  1. Накопление всех приложенных крутящих моментов.

  2. Вычисление углового ускорения:

    angularAcceleration = inverseInertia * torque
  3. Обновление угловой скорости:

    angularVelocity += angularAcceleration * dt
  4. Обновление ориентации тела через кватернион.

Крутящий момент не изменяет позицию напрямую — только вращение.


Связь с моментом инерции

Момент инерции (inertia) определяет, насколько тело сопротивляется вращению. Он зависит от:

  • формы
  • распределения массы
  • размера
  • ориентации

Тела с большим моментом инерции вращаются медленнее при одинаковом крутящем моменте.

Пример:

  • тонкий стержень вращается легче вокруг своей оси
  • массивный куб требует большего момента

В Cannon.js инерция вычисляется автоматически на основе формы (Shape) и массы.


Применение крутящего момента по осям

Вектор крутящего момента определяет ось вращения:

Вектор Вращение вокруг
(1,0,0) оси X
(0,1,0) оси Y
(0,0,1) оси Z

Пример вращения вокруг Z:

body.applyTorque(new CANNON.Vec3(0, 0, 5));

Непрерывное вращение

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

function upd ate() {
    body.applyTorque(new CANNON.Vec3(0, 5, 0));
    world.step(1/60);
}

Так создаётся устойчивое ускоряющееся вращение.


Ограничение угловой скорости

Постоянное применение момента может привести к бесконечному росту скорости. Для контроля используется свойство:

body.angularDamping = 0.5;

angularDamping создаёт эффект сопротивления вращению, имитируя трение воздуха или механические потери.

Значения:

  • 0 — нет затухания
  • 0.1–0.5 — умеренное замедление
  • 1 — мгновенная остановка

Отличие applyTorque от applyForce

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

applyTorque воздействует исключительно на вращение.

Пример силы с плечом:

body.applyForce(
    new CANNON.Vec3(0, 10, 0),
    new CANNON.Vec3(1, 0, 0)
);

В этом случае возникает вращение, даже если applyTorque не используется напрямую.


Пример: вращающийся цилиндр

const cylinderShape = new CANNON.Cylinder(1, 1, 2, 16);

const body = new CANNON.Body({
    mass: 3
});

body.addShape(cylinderShape);
world.addBody(body);

function animate() {
    body.applyTorque(new CANNON.Vec3(0, 15, 0));
    world.step(1/60);
}

Так моделируется поведение двигателя или вращающегося барабана.


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

Крутящий момент действует относительно центра масс тела. Если форма смещена, поведение может отличаться от визуальных ожиданий.

При использовании нескольких форм:

body.addShape(shape, new CANNON.Vec3(0, 1, 0));

центр масс пересчитывается автоматически.

Смещение влияет на:

  • устойчивость вращения
  • гироскопические эффекты
  • динамическую стабильность

Работа с угловой скоростью напрямую

Иногда требуется мгновенное изменение вращения без физического расчёта. В этом случае используется:

body.angularVelocity.se t(0, 5, 0);

Однако это нарушает физическую модель. applyTorque предпочтительнее, когда требуется реалистичное поведение.


Импульсный момент

Cannon.js также поддерживает мгновенное вращательное воздействие через:

body.angularVelocity.vadd(...)

или через применение импульса силы с плечом.

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


Управление вращением в играх

Типовые сценарии:

1. Колёсная техника

  • вращение колёс
  • реакция на торможение

2. Космические симуляции

  • реактивные двигатели создают torque
  • ориентация корабля через моменты

3. Механизмы

  • шестерни
  • турбины
  • маховики

Стабильность симуляции

При больших значениях момента возможны:

  • численные ошибки
  • нестабильное вращение
  • «взрыв» объекта

Рекомендуется:

  • использовать фиксированный шаг 1/60
  • ограничивать массу и размеры
  • избегать экстремальных значений torque

Совместимость с библиотекой Three.js

Визуализация обычно выполняется через Three.js.

Синхронизация выполняется так:

mesh.quaternion.copy(body.quaternion);

Вращение, полученное через applyTorque, автоматически отражается в рендере.


Практический паттерн: управление поворотом персонажа

const turnForce = 20;

if (turnLeft) {
    body.applyTorque(new CANNON.Vec3(0, turnForce, 0));
}

if (turnRight) {
    body.applyTorque(new CANNON.Vec3(0, -turnForce, 0));
}

Сочетание с angularDamping позволяет добиться контролируемого и реалистичного поведения.


Физические особенности

  • Крутящий момент складывается векторно.
  • Несколько вызовов applyTorque суммируются.
  • Воздействие очищается после шага симуляции.
  • На статические тела (mass: 0) момент не влияет.

Вычислительная модель

Упрощённая схема внутри движка:

  1. Интеграция угловых ускорений.
  2. Применение ограничений (constraints).
  3. Коррекция столкновений.
  4. Нормализация кватерниона.

Это обеспечивает стабильную физику при корректных параметрах.


Типичные ошибки

Ничего не вращается

  • масса равна 0
  • тело находится в режиме KINEMATIC
  • забыта функция world.step()

Вращение слишком резкое

  • момент слишком большой
  • отсутствует angularDamping

Объект вращается не по ожидаемой оси

  • перепутаны мировые и локальные координаты
  • неправильный центр масс

Глубокие аспекты: гироскопический эффект

При быстром вращении возникают сложные эффекты:

  • прецессия
  • изменение оси вращения
  • нестабильность при асимметричной инерции

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


Оптимизация

  • избегать частого создания Vec3 в цикле
  • переиспользовать объекты векторов
  • не применять чрезмерные значения момента

Пример оптимизации:

const torque = new CANNON.Vec3();

function upd ate() {
    torque.se t(0, 10, 0);
    body.applyTorque(torque);
}

Контроль вращения через ограничения

В сочетании с HingeConstraint или LockConstraint можно ограничивать оси вращения, сохраняя применение torque только по нужному направлению.

Это используется для:

  • дверей
  • подвесок
  • шарнирных механизмов

Математическая интерпретация

Крутящий момент:

τ = r × F

где:

  • τ — torque
  • r — плечо силы
  • F — сила
  • × — векторное произведение

Метод applyTorque позволяет миновать вычисление плеча, задавая итоговый момент напрямую.


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