Ammo.js — это JavaScript-порт популярной библиотеки Bullet Physics, предоставляющий возможности полноценной физической симуляции в браузере. Для создания реалистичного движения транспортных средств ключевым аспектом является синхронизация визуальных колёс с физическим движением, обеспечиваемая системой колесных тел в Ammo.js.
В основе лежит btRaycastVehicle,
который моделирует поведение автомобиля с помощью физики, не создавая
отдельные твёрдые тела для каждого колеса. Колёса задаются через
btWheelInfo, в котором описываются
параметры подвески, сцепления с поверхностью и радиус.
let wheelInfo = vehicle.addWheel(
wheelPosition, // btVector3: позиция колеса относительно центра тела
wheelDirection, // btVector3: направление силы тяжести
wheelAxle, // btVector3: направление оси колеса
suspensionRestLength, // длина подвески
wheelRadius, // радиус колеса
tuning, // объект btVehicleTuning
isFrontWheel // boolean: переднее или заднее
);
Ключевые параметры btWheelInfo:
m_suspensionStiffness — жесткость подвески. Большие
значения делают подвеску более жёсткой.m_wheelsDampingRelaxation и
m_wheelsDampingCompression — демпфирование подвески при
сжатии и расслаблении.m_frictionSlip — коэффициент сцепления колеса с
поверхностью.m_rollInfluence — влияние силы крена на транспортное
средство.Визуальное колесо в Three.js или Babylon.js обычно является отдельной
меш-геометрией. Оно не участвует в физике напрямую:
позиция и поворот задаются на основе состояния
btRaycastVehicle.
function updateWheelTransform(vehicle, wheelMeshes) {
for (let i = 0; i < vehicle.getNumWheels(); i++) {
let wheelTransform = vehicle.getWheelTransformWS(i);
let origin = wheelTransform.getOrigin();
let rotation = wheelTransform.getRotation();
wheelMeshes[i].position.set(origin.x(), origin.y(), origin.z());
wheelMeshes[i].quaternion.set(rotation.x(), rotation.y(), rotation.z(), rotation.w());
}
}
Особенности синхронизации:
getWheelTransformWS.Движение автомобиля формируется через приложение сил и моментов к колесам. Основные методы:
applyEngineForce(force, wheelIndex) — прикладывает силу
двигателя к конкретному колесу.setBrake(brakeForce, wheelIndex) — тормозной
момент.setSteeringValue(steering, wheelIndex) — поворот
передних колес.Эти методы напрямую влияют на btWheelInfo, что
автоматически отражается на визуальной части через обновление
трансформаций.
// пример управления
vehicle.applyEngineForce(engineForce, 2); // заднее колесо
vehicle.setBrake(brakeForce, 0); // переднее колесо
vehicle.setSteeringValue(steeringAngle, 0);
Реализм движения обеспечивается имитацией работы подвески. Система колес использует лучевое отслеживание (raycast), чтобы вычислить точку контакта с поверхностью. Параметры подвески влияют на:
Правильная настройка подвески позволяет колёсам не «врезаться» в землю и обеспечивает реалистичные отскоки при столкновениях с препятствиями.
Ammo.js выполняет сложные расчёты физики, поэтому при синхронизации колес важно:
for были минимальными.Частая ошибка — некорректная ориентация колеса в Three.js. Для её исправления:
wheelAxle при создании
btWheelInfo.THREE.Object3D контейнер для корректного
поворота.m_suspensionLength.slip angle).Синхронизация визуальных колёс с физикой в Ammo.js требует точного
следования данным btRaycastVehicle и постоянного обновления
их состояния в рендере. Это позволяет получить реалистичное поведение
автомобиля на любой поверхности и обеспечивает плавность и
правдоподобность анимации.