Крутящий момент (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.
Во время шага симуляции (world.step(dt)) происходит:
Накопление всех приложенных крутящих моментов.
Вычисление углового ускорения:
angularAcceleration = inverseInertia * torqueОбновление угловой скорости:
angularVelocity += angularAcceleration * dtОбновление ориентации тела через кватернион.
Крутящий момент не изменяет позицию напрямую — только вращение.
Момент инерции (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 от applyForceapplyForce создаёт поступательное движение, но если сила
приложена не к центру массы, возникает дополнительный крутящий
момент.
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. Космические симуляции
3. Механизмы
При больших значениях момента возможны:
Рекомендуется:
1/60Визуализация обычно выполняется через 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) момент не влияет.Упрощённая схема внутри движка:
Это обеспечивает стабильную физику при корректных параметрах.
Ничего не вращается
KINEMATICworld.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
где:
τ — torquer — плечо силыF — сила× — векторное произведениеМетод applyTorque позволяет миновать вычисление плеча,
задавая итоговый момент напрямую.
Применение applyTorque формирует фундамент вращательной
динамики в Cannon.js. Через корректное управление моментом,
демпфированием и ограничениями создаются устойчивые механические
системы, управляемые персонажи, транспорт и сложные физические симуляции
с реалистичным поведением вращения.