Ammo.js использует трехмерную правостороннюю систему координат, аналогичную той, что применяется в WebGL и большинстве движков для рендеринга. Оси координат определяются следующим образом:
В физическом мире это соответствует стандартной правой системе координат, где вращение считается положительным по правилу правого винта.
Ammo.js не накладывает жестких ограничений на выбор единиц, но для корректной симуляции и стабильной работы рекомендуется использовать реалистичные физические масштабы:
btRigidBody и влияет на динамику при столкновениях и
ускорениях.applyCentralForce и applyTorque.deltaTime при
обновлении мира (stepSimulation) указывает величину
временного шага.Неправильный масштаб объектов может приводить к нестабильности симуляции, чрезмерным вибрациям и «пролетающим» телам. Например, объекты с длиной меньше 0.01 метра или больше 100 метров часто создают численные артефакты из-за ограничений интегратора.
Каждое тело (btRigidBody) имеет
трансформацию, включающую положение и ориентацию:
let transform = new Ammo.btTransform();
rigidBody.getMotionState().getWorldTransform(transform);
let origin = transform.getOrigin();
let rotation = transform.getRotation();
origin возвращает объект btVector3 с
координатами X, Y, Z.rotation возвращает объект btQuaternion с
компонентами X, Y, Z, W, определяющими вращение тела.Использование кватернионов вместо углов Эйлера позволяет избежать проблем с гимбал-локом при вращении объектов.
При интеграции Ammo.js с рендерингом (Three.js, Babylon.js) важно поддерживать одинаковый масштаб:
1/60 секунды для 60 FPS.Любое несоответствие масштабов приводит к разнице в скорости падения, столкновениях и вращениях.
Каждое тело имеет локальную систему координат,
относительно которой задаются силы и торки. Методы
applyLocalForce и applyTorque используют эти
локальные координаты.
Для преобразования между мировыми и локальными координатами применяются методы:
let localPoint = body.getCenterOfMassTransform().inverse().op_mul(worldPoint);
Это позволяет корректно рассчитывать прикладываемые силы на основе ориентации тела.
deltaTime) лучше держать постоянным
или дробить на несколько шагов для точности.btVector3 для положения.Это фундаментальные принципы, на которых строится корректная работа физических тел в Ammo.js, обеспечивая стабильную симуляцию и точное соответствие визуализации.