В 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 предоставляет гибкий и детализированный контроль над
колесами, что позволяет моделировать как простые машинки, так и сложные
транспортные средства с независимой подвеской и сложной динамикой.