Отладка геометрии колёс

Cannon.js предоставляет возможность моделировать физику твёрдых тел в трёхмерной среде, включая динамику транспорта и взаимодействие колёс с поверхностью. Для колёс обычно используется комбинация RigidBody и WheelInfo, что позволяет эмулировать вращение, сцепление с поверхностью и пружинную подвеску.

Колёса создаются через объект CANNON.RaycastVehicle, который управляет взаимодействием с поверхностью, применяя лучевой метод для определения контакта колеса с землёй. Основные параметры колеса включают радиус, ширину, смещение относительно центра транспортного средства, угол наклона и коэффициенты сцепления.

Пример базового объявления колеса:

const wheelOptions = {
    radius: 0.4,
    directionLocal: new CANNON.Vec3(0, -1, 0),
    axleLocal: new CANNON.Vec3(-1, 0, 0),
    suspensionStiffness: 30,
    suspensionRestLength: 0.3,
    frictionSlip: 5,
    dampingRelaxation: 2.3,
    dampingCompression: 4.4,
    maxSuspensionForce: 100000,
    rollInfluence: 0.01,
    maxSuspensionTravel: 0.3,
    customSlidingRotationalSpeed: -30,
    useCustomSlidingRotationalSpeed: true
};
vehicle.addWheel(wheelOptions);

Настройка подвески и сцепления

SuspensionStiffness определяет жёсткость пружины колеса. При слишком высоких значениях модель становится “жёсткой” и может подпрыгивать на неровностях, а слишком низкие значения приводят к проседанию колеса.

SuspensionRestLength — это длина пружины в состоянии покоя. Динамика подвески сильно зависит от этого параметра: слишком короткая подвеска ограничивает ход колеса, слишком длинная делает автомобиль неустойчивым.

FrictionSlip отвечает за скольжение. Его точная настройка влияет на поведение транспорта при ускорении и торможении. Для асфальта обычно используют значения 4–6, для грунта 1–3.

Диагностика и визуализация колёс

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

Полезно создавать вспомогательные объекты:

vehicle.wheelInfos.forEach(wheel => {
    const debugSphere = new THREE.Mesh(
        new THREE.SphereGeometry(0.05),
        new THREE.MeshBasicMaterial({ color: 0xff0000 })
    );
    scene.add(debugSphere);
    wheel.debugMesh = debugSphere;
});

В рендер-цикле:

vehicle.wheelInfos.forEach(wheel => {
    const transform = wheel.worldTransform;
    wheel.debugMesh.position.copy(transform.position);
});

Так можно отслеживать положение колёс в пространстве и корректировать смещения.

Проверка взаимодействия с поверхностью

Лучевой метод (raycast) позволяет определить точку контакта колеса с землёй. Если колёса «проваливаются» или тележка подпрыгивает, необходимо проверить:

  • направление локальной оси directionLocal (обычно 0,-1,0 для колеса вниз);
  • ось вращения axleLocal (обычно -1,0,0);
  • смещение колеса относительно центра (chassisConnectionPointLocal).

Также стоит проверить массу колеса и шасси, чтобы соотношение не делало транспорт слишком лёгким или тяжёлым для выбранной подвески.

Отладка вращения и силы скольжения

CustomSlidingRotationalSpeed используется для задания минимальной скорости вращения колеса при скольжении. Если колесо проскальзывает при трогании с места, можно увеличить это значение.

RollInfluence влияет на крен транспортного средства при повороте. Если значение слишком высоко, машина может перевернуться даже на плавных поворотах.

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

wheelMesh.rotation.x += wheel.deltaRotation;

Логирование и проверка параметров

Для точной диагностики полезно выводить параметры каждого колеса в консоль:

vehicle.wheelInfos.forEach((wheel, index) => {
    console.log(`Колесо ${index}: position=${wheel.worldTransform.position.toString()}, suspensionLength=${wheel.suspensionLength.toFixed(2)}, isInContact=${wheel.isInContact}`);
});

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

Типичные ошибки и их причины

  • Колёса смещены относительно шасси — неправильные chassisConnectionPointLocal или оси.
  • Подвеска слишком мягкая или жёсткая — некорректные suspensionStiffness и damping.
  • Пропадание контакта с землёй — неверный directionLocal или слишком большой suspensionRestLength.
  • Скольжение или «залипание» колёс — недостаточный frictionSlip или customSlidingRotationalSpeed.

Оптимизация и производительность

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

Рекомендации:

  • Использовать упрощённые Sphere или Cylinder для колёс в расчётах физики.
  • Разделять визуальные и физические объекты, чтобы облегчить отладку.
  • Применять debugMesh для всех ключевых точек контакта и осей вращения.

Это обеспечивает точную настройку транспортных средств и предотвращает распространённые ошибки при симуляции движения и взаимодействия с поверхностью.