RigidVehicle как альтернатива

RigidVehicle — это специализированный объект физики в библиотеке Cannon.js, предназначенный для моделирования транспортных средств с жёсткой подвеской. В отличие от обычных тел (Body), RigidVehicle управляет комплексной структурой из шасси и колёс, обеспечивая реалистичное поведение автомобиля в физическом мире.

В основе конструкции RigidVehicle лежит шасси — тело типа CANNON.Body, к которому привязываются колёса через объекты CANNON.RaycastVehicle.WheelInfo. Каждое колесо может иметь индивидуальные параметры, включая позицию относительно шасси, направление подвески и характеристики торможения.

Создание шасси и инициализация RigidVehicle

Для начала необходимо создать тело шасси:

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) — задаёт угол поворота для рулевых колёс.

Физические особенности и преимущества RigidVehicle

  1. Стабильность на высоких скоростях Использование жёсткой подвески и RaycastVehicle позволяет уменьшить «прыжки» и нежелательные вращения шасси при столкновениях.

  2. Реалистичная подвеска Подвеска моделируется через лучи (raycast) вместо физического тела колеса, что значительно снижает вычислительную нагрузку при симуляции сложных транспортных средств.

  3. Гибкость настройки колес Для каждого колеса можно индивидуально задавать жесткость, демпфирование и угол поворота. Это позволяет моделировать как спортивные автомобили, так и грузовики или багги.

  4. Совместимость с другими телами 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.
  • Ограничивать количество колёс в сложных симуляциях. Например, для грузовика можно использовать 6–8 колёс вместо 16.
  • Настраивать frictionSlip и suspensionStiffness в зависимости от поверхности сцены для реалистичного поведения.
  • Сохранять однородность направления осей, чтобы избежать неожиданного вращения при столкновениях.

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