RaycastVehicle: архитектура и принцип работы

RaycastVehicle — это специализированный объект физического движка Cannon.js, предназначенный для симуляции транспортных средств с колесами. В отличие от обычных тел с динамикой, колеса не представляют собой полноценные физические тела с объемом. Вместо этого используется лучевой подход (raycasting): каждый колесный контакт с поверхностью вычисляется как пересечение луча с телом мира, что обеспечивает эффективную и стабильную физику автомобиля даже при высокой скорости и сложном рельефе.

В основе лежит концепция, что колеса — это точки контакта с поверхностью, и их поведение моделируется через силы, а не через столкновения твердого тела. Такой подход снижает вычислительную нагрузку, упрощает настройку подвески и предотвращает артефакты при прохождении через препятствия.


Архитектура RaycastVehicle

RaycastVehicle строится на следующих ключевых компонентах:

  1. Тело автомобиля (chassisBody) Это основной объект Cannon.js, представляющий корпус автомобиля. Именно к нему прикрепляются колеса и на него воздействуют силы, создаваемые колесами. Тело имеет следующие свойства:

    • mass — масса автомобиля, влияющая на инерцию.
    • position — текущие координаты в пространстве.
    • quaternion — ориентация тела, используемая для корректного размещения колес.
  2. Колеса (WheelInfo) Каждое колесо описывается объектом WheelInfo, который содержит все параметры колеса и подвески:

    • radius — радиус колеса.
    • directionLocal — направление подвески относительно корпуса. Обычно это вектор, направленный вниз.
    • axleLocal — вектор оси вращения колеса относительно корпуса.
    • suspensionRestLength — длина подвески в состоянии покоя.
    • suspensionStiffness — жесткость подвески.
    • dampingRelaxation / dampingCompression — демпфирование при растяжении и сжатии подвески.
    • frictionSlip — коэффициент сцепления с поверхностью.

    Каждый WheelInfo хранит текущее состояние колеса: пробег подвески, угол поворота, скольжение и силы.

  3. Лучевой контакт (Raycast) RaycastVehicle использует лучи, исходящие из центра колеса в направлении подвески. Основная логика:

    • Луч проходит от колеса вниз на длину подвески.
    • Проверяется пересечение с телами мира (groundBody).
    • Если контакт найден, вычисляется удлинение подвески и нормальная сила.
    • На корпус автомобиля передается реактивная сила, создающая устойчивость и амортизацию.

    Такой подход позволяет симулировать сжатие подвески без реального физического тела колеса.


Принцип работы колес и подвески

Для каждого шага симуляции выполняются следующие действия:

  1. Обновление позиции колес

    • Вычисляется глобальная позиция колеса на основе корпуса и локальных координат.
    • Проверяется пересечение луча с поверхностью.
    • Рассчитывается длина сжатия подвески: [ = - ]
  2. Применение сил подвески

    • Жесткость подвески: [ F_{} = k ]
    • Демпфирование скорости сжатия и растяжения: [ F_{} = -c v_{}]
    • Итоговая сила: [ F_{} = F_{} + F_{}]
    • Сила передается на корпус, что изменяет его ускорение и ориентацию.
  3. Расчет сцепления с дорогой

    • Горизонтальная сила движения вычисляется на основе frictionSlip и скольжения колеса.
    • Используется формула: [ F_{} = F_{}] где (F_{}) — нормальная сила от подвески.
  4. Управление поворотом и ускорением

    • Углы колес обновляются в зависимости от ввода управления (steering).
    • Применяются силы двигателя и тормоза через WheelInfo.engineForce и WheelInfo.brake.

Конфигурация и добавление колес

Колеса добавляются через метод addWheel(options), где options содержит локальные параметры и характеристики подвески:

vehicle.addWheel({
  chassisConnectionPointLocal: new CANNON.Vec3(1, 0, 1),
  isFrontWheel: true,
  directionLocal: new CANNON.Vec3(0, -1, 0),
  axleLocal: new CANNON.Vec3(-1, 0, 0),
  suspensionRestLength: 0.3,
  radius: 0.4,
  suspensionStiffness: 30,
  dampingRelaxation: 2,
  dampingCompression: 2,
  frictionSlip: 5
});
  • chassisConnectionPointLocal — точка крепления колеса на корпусе.
  • isFrontWheel — определяет, переднее это колесо или заднее (важно для управления).
  • Остальные параметры регулируют поведение подвески и сцепление.

После добавления всех колес необходимо вызвать vehicle.addToWorld(world) для интеграции с физическим миром.


Оптимизация и особенности

  • Производительность: RaycastVehicle значительно быстрее, чем полноценные физические колеса, так как исключает необходимость столкновений каждого колеса с поверхностью.
  • Стабильность: Лучи предотвращают проваливание колес сквозь пол, устраняя нестабильность при высоких скоростях.
  • Реализм: Точный расчет подвески и сцепления позволяет моделировать акробатику, заносы и торможение с блокировкой колес.

Расширенные возможности

  1. Регулировка подвески в реальном времени Можно изменять жесткость и демпфирование колес для моделирования разных типов дорог или спортивных режимов.

  2. Скользкие поверхности Изменяя frictionSlip, создается эффект льда или грязи, влияющий на ускорение и маневренность.

  3. Комбинация с другими силами RaycastVehicle корректно взаимодействует с ветром, гравитацией, столкновениями с другими телами.


Взаимодействие с World

RaycastVehicle не является самостоятельным телом: он тесно интегрирован с CANNON.World. На каждом шаге симуляции вызывается метод updateVehicle(timeStep), который:

  • Обновляет позиции колес и корпуса.
  • Вычисляет силы подвески и сцепления.
  • Передает силы на chassisBody для корректного движения в пространстве.

Эта архитектура делает RaycastVehicle гибким инструментом для симуляции автомобилей в 3D-сценах без высоких вычислительных затрат.