Cannon.js — это физический движок на JavaScript, который предоставляет возможность моделировать динамику твёрдых тел, столкновения, трение и силы. Для моделирования колёсных подвесок ключевым инструментом являются пружины и ограничения, которые позволяют имитировать амортизацию и подвижность колёс относительно кузова.
Первый шаг — создание мира с настройкой гравитации и параметров интеграции:
const world = new CANNON.World();
world.gravity.set(0, -9.82, 0);
world.broadphase = new CANNON.NaiveBroadphase();
world.solver.iterations = 10;
Кузов обычно моделируется как CANNON.Body с формой
Box или ConvexPolyhedron. Колёса создаются как
Sphere или цилиндр:
const chassisShape = new CANNON.Box(new CANNON.Vec3(1, 0.5, 2));
const chassisBody = new CANNON.Body({ mass: 1500 });
chassisBody.addShape(chassisShape);
const wheelShape = new CANNON.Sphere(0.5);
const wheelBody = new CANNON.Body({ mass: 20 });
wheelBody.addShape(wheelShape);
Для реализации подвески применяются Spring и DistanceConstraint. Основная идея — соединить колёса с кузовом через пружину, которая может растягиваться и сжиматься.
const suspension = new CANNON.Spring(chassisBody, wheelBody, {
localAnchorA: new CANNON.Vec3(1, 0, 1), // точка крепления на кузове
localAnchorB: new CANNON.Vec3(0, 0, 0), // центр колеса
restLength: 0.5,
stiffness: 200,
damping: 10
});
Чтобы пружина действовала на каждом шаге симуляции, нужно вызывать:
world.addEventListener('postStep', () => {
suspension.applyForce();
});
Для ограничения движения колёс по вертикали можно использовать
CANNON.DistanceConstraint или
CANNON.LockConstraint для имитации фиксированных осей:
const wheelConstraint = new CANNON.DistanceConstraint(chassisBody, wheelBody, 0.5);
world.addConstraint(wheelConstraint);
Для четырёхколёсного транспортного средства создаются отдельные пружины для каждого колеса:
const wheels = [];
const suspensions = [];
const positions = [
new CANNON.Vec3(1, 0, 1),
new CANNON.Vec3(-1, 0, 1),
new CANNON.Vec3(1, 0, -1),
new CANNON.Vec3(-1, 0, -1)
];
positions.forEach(pos => {
const wheel = new CANNON.Body({ mass: 20 });
wheel.addShape(new CANNON.Sphere(0.5));
wheel.position.copy(chassisBody.position.vadd(pos));
wheels.push(wheel);
world.addBody(wheel);
const spring = new CANNON.Spring(chassisBody, wheel, {
localAnchorA: pos,
localAnchorB: new CANNON.Vec3(0, 0, 0),
restLength: 0.5,
stiffness: 200,
damping: 10
});
suspensions.push(spring);
});
world.addEventListener('postStep', () => {
suspensions.forEach(s => s.applyForce());
});
Сочетание stiffness и damping критично для реалистичности:
world.step(dt)) влияет на стабильность: рекомендуется
dt около 1/60.contactMaterial улучшает сцепление и предотвращает
проваливание.Для отображения колёс и кузова используется Three.js или любой другой движок. Позиции объектов синхронизируются после шага физики:
world.step(1/60);
meshChassis.position.copy(chassisBody.position);
meshChassis.quaternion.copy(chassisBody.quaternion);
wheels.forEach((wheel, i) => {
meshWheels[i].position.copy(wheel.position);
meshWheels[i].quaternion.copy(wheel.quaternion);
});
Cannon.js позволяет строить сложные модели колёсных подвесок с
индивидуальными пружинами для каждого колеса, контролировать
демпфирование, жёсткость и ограничения. Комбинация Spring,
DistanceConstraint и точной настройки массы и параметров
мира обеспечивает реалистичное поведение транспортного средства в
3D-среде.