RigidVehicle — это специализированный объект физики в библиотеке Cannon.js, предназначенный для моделирования транспортных средств с жёсткой подвеской. В отличие от обычных тел (Body), RigidVehicle управляет комплексной структурой из шасси и колёс, обеспечивая реалистичное поведение автомобиля в физическом мире.
В основе конструкции RigidVehicle лежит шасси — тело
типа CANNON.Body, к которому привязываются колёса через
объекты CANNON.RaycastVehicle.WheelInfo. Каждое колесо
может иметь индивидуальные параметры, включая позицию относительно
шасси, направление подвески и характеристики торможения.
Для начала необходимо создать тело шасси:
const chassisShape = new CANNON.Box(new CANNON.Vec3(1, 0.5, 2));
const chassisBody = new CANNON.Body({ mass: 150 });
chassisBody.addShape(chassisShape);
После этого создаётся объект RigidVehicle:
const vehicle = new CANNON.RaycastVehicle({
chassisBody: chassisBody,
indexRightAxis: 0, // ось X вправо
indexUpAxis: 1, // ось Y вверх
indexForwardAxis: 2 // ось Z вперёд
});
Ключевые параметры:
indexRightAxis, indexUpAxis,
indexForwardAxis определяют ориентацию шасси и колёс в
мировых координатах.chassisBody — тело, к которому будут присоединены все
колёса.Колёса добавляются через метод addWheel, который
принимает объект с параметрами колеса:
vehicle.addWheel({
chassisConnectionPointLocal: new CANNON.Vec3(1, 0, 1.5),
isFrontWheel: true,
suspensionRestLength: 0.3,
radius: 0.5,
directionLocal: new CANNON.Vec3(0, -1, 0),
axleLocal: new CANNON.Vec3(-1, 0, 0),
suspensionStiffness: 30,
dampingRelaxation: 2.3,
dampingCompression: 4.4,
maxSuspensionForce: 100000,
maxSuspensionTravel: 0.3,
frictionSlip: 5,
rollInfluence: 0.01
});
Основные параметры колеса:
chassisConnectionPointLocal — точка крепления к шасси в
локальных координатах.isFrontWheel — логическое значение, определяющее,
управляется ли колесо рулём.suspensionRestLength — длина подвески в состоянии
покоя.directionLocal и axleLocal — векторы
направления подвески и оси вращения.suspensionStiffness, dampingRelaxation,
dampingCompression — параметры упругости и
демпфирования.frictionSlip — коэффициент сцепления с
поверхностью.rollInfluence — влияние вращения колеса на крен
шасси.После добавления всех колёс необходимо вызвать метод
addToWorld:
vehicle.addToWorld(world);
Этот метод создаёт внутренние тела колёс и подключает их к шасси
через систему RaycastVehicle. Каждое колесо движется
независимо, но остаётся жёстко привязанным к шасси через подвеску.
Силы и вращение управляются через методы
applyEngineForce и setSteeringValue. Пример
для передних колёс:
vehicle.setSteeringValue(0.3, 0); // угол поворота в радианах для колеса 0
vehicle.applyEngineForce(500, 2); // сила двигателя для заднего колеса
vehicle.applyEngineForce(500, 3);
applyEngineForce(force, wheelIndex) — применяет силу к
конкретному колесу. Положительное значение двигает вперёд, отрицательное
— назад.setSteeringValue(value, wheelIndex) — задаёт угол
поворота для рулевых колёс.Стабильность на высоких скоростях Использование жёсткой подвески и RaycastVehicle позволяет уменьшить «прыжки» и нежелательные вращения шасси при столкновениях.
Реалистичная подвеска Подвеска моделируется через лучи (raycast) вместо физического тела колеса, что значительно снижает вычислительную нагрузку при симуляции сложных транспортных средств.
Гибкость настройки колес Для каждого колеса можно индивидуально задавать жесткость, демпфирование и угол поворота. Это позволяет моделировать как спортивные автомобили, так и грузовики или багги.
Совместимость с другими телами Cannon.js
RigidVehicle взаимодействует с обычными телами
(CANNON.Body) через столкновения, позволяя строить сцены с
препятствиями, трамплинами и другими объектами.
Для синхронизации с графическим движком (например, Three.js) необходимо обновлять положение и вращение визуального объекта колеса на каждом кадре:
world.addEventListener('postStep', function() {
for (let i = 0; i < vehicle.wheelInfos.length; i++) {
const wheel = vehicle.wheelInfos[i];
const transform = wheel.worldTransform;
wheelMeshes[i].position.copy(transform.position);
wheelMeshes[i].quaternion.copy(transform.quaternion);
}
chassisMesh.position.copy(chassisBody.position);
chassisMesh.quaternion.copy(chassisBody.quaternion);
});
RaycastVehicle вместо физических тел для
колёс, чтобы снизить нагрузку на CPU.frictionSlip и
suspensionStiffness в зависимости от поверхности сцены для
реалистичного поведения.RigidVehicle обеспечивает мощный и гибкий способ создания транспортных средств в Cannon.js, сочетая высокую производительность с точным управлением физикой шасси и колёс.