RaycastVehicle — это специализированный объект физического движка Cannon.js, предназначенный для симуляции транспортных средств с колесами. В отличие от обычных тел с динамикой, колеса не представляют собой полноценные физические тела с объемом. Вместо этого используется лучевой подход (raycasting): каждый колесный контакт с поверхностью вычисляется как пересечение луча с телом мира, что обеспечивает эффективную и стабильную физику автомобиля даже при высокой скорости и сложном рельефе.
В основе лежит концепция, что колеса — это точки контакта с поверхностью, и их поведение моделируется через силы, а не через столкновения твердого тела. Такой подход снижает вычислительную нагрузку, упрощает настройку подвески и предотвращает артефакты при прохождении через препятствия.
RaycastVehicle строится на следующих ключевых компонентах:
Тело автомобиля (chassisBody) Это основной объект Cannon.js, представляющий корпус автомобиля. Именно к нему прикрепляются колеса и на него воздействуют силы, создаваемые колесами. Тело имеет следующие свойства:
Колеса (WheelInfo) Каждое колесо описывается объектом WheelInfo, который содержит все параметры колеса и подвески:
Каждый WheelInfo хранит текущее состояние колеса: пробег подвески, угол поворота, скольжение и силы.
Лучевой контакт (Raycast) RaycastVehicle использует лучи, исходящие из центра колеса в направлении подвески. Основная логика:
Такой подход позволяет симулировать сжатие подвески без реального физического тела колеса.
Для каждого шага симуляции выполняются следующие действия:
Обновление позиции колес
Применение сил подвески
Расчет сцепления с дорогой
Управление поворотом и ускорением
Колеса добавляются через метод 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
});
После добавления всех колес необходимо вызвать
vehicle.addToWorld(world) для интеграции с физическим
миром.
Регулировка подвески в реальном времени Можно изменять жесткость и демпфирование колес для моделирования разных типов дорог или спортивных режимов.
Скользкие поверхности Изменяя
frictionSlip, создается эффект льда или грязи, влияющий на
ускорение и маневренность.
Комбинация с другими силами RaycastVehicle корректно взаимодействует с ветром, гравитацией, столкновениями с другими телами.
RaycastVehicle не является самостоятельным телом: он тесно
интегрирован с CANNON.World. На каждом шаге симуляции
вызывается метод updateVehicle(timeStep), который:
chassisBody для корректного движения в
пространстве.Эта архитектура делает RaycastVehicle гибким инструментом для симуляции автомобилей в 3D-сценах без высоких вычислительных затрат.