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

В Cannon.js управление колёсами транспортных средств реализуется через объект WheelInfo, который содержит всю необходимую информацию о физическом поведении колеса. Этот объект используется совместно с RaycastVehicle для моделирования движущихся машин, велосипедов или других транспортных средств с колесами.


Создание WheelInfo

Для создания колеса используется конструктор WheelInfo(options), где options — это объект с конфигурацией колеса. Основные параметры:

  • chassisConnectionPointLocal (Vec3) — точка крепления колеса к шасси в локальной системе координат транспортного средства. Определяет позицию колеса относительно корпуса.
  • directionLocal (Vec3) — направление подвески колеса. Обычно указывается векторами типа (0, -1, 0), чтобы подвеска смотрела вниз.
  • axleLocal (Vec3) — локальная ось вращения колеса. Для переднеприводных машин обычно (1, 0, 0).
  • suspensionRestLength (number) — длина подвески в состоянии покоя. Определяет, на сколько колесо может прогибаться при нагрузке.
  • radius (number) — радиус колеса.
  • suspensionStiffness (number) — жесткость подвески. Более высокие значения создают более «жесткую» подвеску.
  • dampingRelaxation и dampingCompression (number) — коэффициенты демпфирования, определяющие скорость возвращения подвески после сжатия и растяжения.
  • frictionSlip (number) — коэффициент скольжения, определяющий сцепление с поверхностью.
  • steering (number, optional) — угол поворота колеса в радианах.
  • engineForce (number, optional) — сила, прикладываемая к колесу при ускорении.
  • brake (number, optional) — сила торможения.

Пример создания колеса:

const wheel = new CANNON.WheelInfo({
    chassisConnectionPointLocal: new CANNON.Vec3(1, 0, 0.5),
    directionLocal: new CANNON.Vec3(0, -1, 0),
    axleLocal: new CANNON.Vec3(-1, 0, 0),
    suspensionRestLength: 0.3,
    radius: 0.4,
    suspensionStiffness: 30,
    dampingRelaxation: 2.3,
    dampingCompression: 4.4,
    frictionSlip: 5
});

Связь с RaycastVehicle

WheelInfo не функционирует самостоятельно. Для использования колёс создается объект RaycastVehicle, который принимает шасси (твердое тело Body) и добавляет колеса:

const vehicle = new CANNON.RaycastVehicle({
    chassisBody: chassisBody
});

vehicle.addWheel(wheel);
vehicle.addToWorld(world);

Каждое колесо, добавленное через addWheel, сохраняется в массиве vehicle.wheelInfos. С помощью этого массива можно динамически изменять параметры колёс, например, угол поворота или силу торможения во время симуляции.


Параметры подвески и демпфирования

Подвеска колеса моделируется с использованием пружины и демпфера:

  • suspensionStiffness — определяет жесткость пружины; высокая жесткость уменьшает прогиб подвески при нагрузке.
  • dampingCompression — демпфирование сжатия; предотвращает резкие удары при контакте с поверхностью.
  • dampingRelaxation — демпфирование растяжения; контролирует возврат подвески после сжатия.

Формула силы подвески обычно вычисляется как:

[ F = -k x - c v]

где k — stiffness, x — отклонение подвески от состояния покоя, c — демпфирование, v — скорость изменения длины подвески.


Управление колесами

  • engineForce и brake используются для динамического управления ускорением и торможением колес.
  • steering задает угол поворота передних колес. Изменяется в радианах и влияет на направление движения транспортного средства.
  • frictionSlip отвечает за сцепление с поверхностью; низкое значение вызывает проскальзывание, высокое — сцепление с дорогой.

Пример обновления колеса в симуляции:

vehicle.setSteeringValue(0.3, 0); // повернуть переднее левое колесо
vehicle.applyEngineForce(1500, 2); // заднее колесо ускорение
vehicle.setBrake(5, 1); // заднее левое колесо торможение

Особенности и нюансы

  • WheelInfo не зависит от визуального представления колеса; его позиция и вращение вычисляются через физический движок.
  • Радиус колеса, положение и жесткость подвески сильно влияют на устойчивость транспортного средства.
  • В отличие от обычного RigidBody, колеса RaycastVehicle используют «лучевую» проверку столкновений (raycasting), что экономит ресурсы и позволяет точно моделировать поведение подвески без сложной геометрии.

Оптимизация и настройка

Для реалистичного поведения транспортного средства рекомендуется:

  • Использовать правильное соотношение suspensionStiffness и damping для каждого типа поверхности.
  • Настраивать frictionSlip в зависимости от сцепления с дорогой.
  • Проверять chassisConnectionPointLocal для симметричного расположения колес и предотвращения перекосов.

WheelInfo предоставляет гибкий и детализированный контроль над колесами, что позволяет моделировать как простые машинки, так и сложные транспортные средства с независимой подвеской и сложной динамикой.