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 для всех ключевых точек контакта и
осей вращения.Это обеспечивает точную настройку транспортных средств и предотвращает распространённые ошибки при симуляции движения и взаимодействия с поверхностью.