Добавление колёс: addWheel

Метод addWheel является ключевым инструментом для создания транспортных средств с колёсами в физическом движке Ammo.js. Он позволяет добавить колёса к телу автомобиля, задавая их физические свойства, позиции и параметры подвески. Обычно этот метод используется в сочетании с объектами типа btRaycastVehicle для симуляции динамики транспортного средства.

vehicle.addWheel(connectionPoint, wheelDirection, wheelAxle, suspensionRestLength, wheelRadius, tuning, isFrontWheel);

Параметры метода:

  1. connectionPoint (btVector3) — точка крепления колеса относительно центра корпуса автомобиля. Важно учитывать систему координат: в Ammo.js ось Y направлена вверх. Пример:
let connectionPoint = new Ammo.btVector3(1, 0.5, 2);
  1. wheelDirection (btVector3) — направление подвески колеса. Обычно это вектор вниз по оси Y:
let wheelDirection = new Ammo.btVector3(0, -1, 0);
  1. wheelAxle (btVector3) — ось вращения колеса. Для стандартной конфигурации автомобилей это ось X:
let wheelAxle = new Ammo.btVector3(-1, 0, 0);
  1. suspensionRestLength (number) — длина подвески в исходном состоянии. Определяет, на сколько колесо может прогибаться под нагрузкой:
let suspensionRestLength = 0.6;
  1. wheelRadius (number) — радиус колеса. Радиус влияет на контакт с поверхностью и на скорость вращения:
let wheelRadius = 0.5;
  1. tuning (btVehicleTuning) — объект с настройками подвески, трения и тормозной силы. Пример создания:
let tuning = new Ammo.btVehicleTuning();
tuning.set_m_suspensionStiffness(20);
tuning.set_m_suspensionDamping(2.3);
tuning.set_m_suspensionCompression(4.4);
tuning.set_m_maxSuspensionTravelCm(500);
tuning.set_m_frictionSlip(1000);
tuning.set_m_maxSuspensionForce(6000);
  1. isFrontWheel (boolean) — флаг, указывающий, является ли колесо передним. Влияет на управление и распределение сил привода.

Создание и добавление колёс к автомобилю

Для корректного добавления колёс необходимо предварительно создать объект btRaycastVehicle. Пример создания автомобиля:

let chassisShape = new Ammo.btBoxShape(new Ammo.btVector3(1, 0.5, 2));
let mass = 800;
let localInertia = new Ammo.btVector3(0, 0, 0);
chassisShape.calculateLocalInertia(mass, localInertia);

let startTransform = new Ammo.btTransform();
startTransform.setIdentity();
startTransform.setOrigin(new Ammo.btVector3(0, 1, 0));

let motionState = new Ammo.btDefaultMotionState(startTransform);
let rbInfo = new Ammo.btRigidBodyConstructionInfo(mass, motionState, chassisShape, localInertia);
let chassisBody = new Ammo.btRigidBody(rbInfo);

let tuning = new Ammo.btVehicleTuning();
let vehicleRayCaster = new Ammo.btDefaultVehicleRaycaster(physicsWorld);
let vehicle = new Ammo.btRaycastVehicle(tuning, chassisBody, vehicleRayCaster);

vehicle.setCoordinateSystem(0, 1, 2);

После этого можно добавлять колёса:

let wheelDirection = new Ammo.btVector3(0, -1, 0);
let wheelAxle = new Ammo.btVector3(-1, 0, 0);

vehicle.addWheel(new Ammo.btVector3(-1, 0.5, 2), wheelDirection, wheelAxle, 0.6, 0.5, tuning, true);
vehicle.addWheel(new Ammo.btVector3(1, 0.5, 2), wheelDirection, wheelAxle, 0.6, 0.5, tuning, true);
vehicle.addWheel(new Ammo.btVector3(-1, 0.5, -2), wheelDirection, wheelAxle, 0.6, 0.5, tuning, false);
vehicle.addWheel(new Ammo.btVector3(1, 0.5, -2), wheelDirection, wheelAxle, 0.6, 0.5, tuning, false);

Настройка свойств колёс

Каждое колесо после добавления можно настроить через объект btWheelInfo, который возвращается методом getWheelInfo:

let wheel = vehicle.getWheelInfo(0);
wheel.set_m_suspensionStiffness(25);
wheel.set_m_wheelsDampingRelaxation(2.3);
wheel.set_m_wheelsDampingCompression(4.4);
wheel.set_m_frictionSlip(1000);
wheel.set_m_rollInfluence(0.1);

Основные свойства колеса:

  • m_suspensionStiffness — жесткость подвески.
  • m_wheelsDampingRelaxation и m_wheelsDampingCompression — демпфирование при сжатии и расслаблении.
  • m_frictionSlip — коэффициент сцепления с поверхностью.
  • m_rollInfluence — влияние крена кузова на колесо.

Эти параметры критичны для реалистичного поведения автомобиля: слишком жесткая подвеска приведет к «прыжкам» на неровностях, а низкий коэффициент сцепления к пробуксовке.


Визуализация и обновление колёс

После добавления колёс физическая модель и визуальная модель должны быть синхронизированы. Для этого на каждом кадре необходимо обновлять положение колёс:

for (let i = 0; i < vehicle.getNumWheels(); i++) {
    vehicle.updateWheelTransform(i, true);
    let transform = vehicle.getWheelTransformWS(i);
    let pos = transform.getOrigin();
    let rot = transform.getRotation();
    // Обновление графической модели колеса
    wheelMesh[i].position.set(pos.x(), pos.y(), pos.z());
    wheelMesh[i].quaternion.set(rot.x(), rot.y(), rot.z(), rot.w());
}

Метод updateWheelTransform пересчитывает положение колеса в мировой системе координат с учетом подвески, угла поворота и вращения.


Практические рекомендации

  • Расположение connectionPoint должно точно соответствовать геометрии автомобиля, иначе колёса будут проваливаться или летать.
  • wheelDirection и wheelAxle определяют ось вращения и поведение подвески; неверные значения приводят к нестабильности.
  • Для каждого колеса можно индивидуально задавать свойства, что позволяет симулировать разные типы подвески спереди и сзади.
  • Настройка btVehicleTuning перед добавлением колёс критична: изменение параметров после добавления колёс не всегда корректно обновляет внутренние данные физического движка.

Метод addWheel является основой динамической симуляции транспортных средств в Ammo.js. Правильная настройка всех параметров обеспечивает реалистичное поведение автомобиля на сложной поверхности и позволяет интегрировать физику колес в полноценную игру или симулятор.