Метод addWheel является ключевым инструментом для
создания транспортных средств с колёсами в физическом движке Ammo.js. Он
позволяет добавить колёса к телу автомобиля, задавая их физические
свойства, позиции и параметры подвески. Обычно этот метод используется в
сочетании с объектами типа btRaycastVehicle для симуляции
динамики транспортного средства.
vehicle.addWheel(connectionPoint, wheelDirection, wheelAxle, suspensionRestLength, wheelRadius, tuning, isFrontWheel);
Параметры метода:
btVector3) — точка
крепления колеса относительно центра корпуса автомобиля. Важно учитывать
систему координат: в Ammo.js ось Y направлена вверх. Пример:let connectionPoint = new Ammo.btVector3(1, 0.5, 2);
btVector3) —
направление подвески колеса. Обычно это вектор вниз по оси Y:let wheelDirection = new Ammo.btVector3(0, -1, 0);
btVector3) — ось вращения
колеса. Для стандартной конфигурации автомобилей это ось X:let wheelAxle = new Ammo.btVector3(-1, 0, 0);
number) — длина
подвески в исходном состоянии. Определяет, на сколько колесо может
прогибаться под нагрузкой:let suspensionRestLength = 0.6;
number) — радиус колеса.
Радиус влияет на контакт с поверхностью и на скорость вращения:let wheelRadius = 0.5;
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);
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. Правильная настройка всех параметров
обеспечивает реалистичное поведение автомобиля на сложной поверхности и
позволяет интегрировать физику колес в полноценную игру или
симулятор.