В Cannon.js физическая симуляция строится на числовых значениях, которые напрямую соответствуют реальным величинам только в том случае, если соблюдена согласованная система единиц. Основная идея заключается в том, что физический движок оперирует безразмерными числами, но для стабильности и предсказуемости симуляции рекомендуется использовать согласованную метрическую систему: метры для длины, килограммы для массы, секунды для времени.
Масштаб сцены влияет на стабильность интегратора и точность столкновений. В Cannon.js существует ряд практических ограничений:
Масса объектов в Cannon.js задается напрямую в килограммах, но важно учитывать соотношение массы и размеров:
const sphereBody = new CANNON.Body({
mass: 5, // кг
shape: new CANNON.Sphere(1) // радиус в метрах
});
Для устойчивой симуляции рекомендуется поддерживать массу и размер в соразмерном диапазоне, например:
Плотность объектов не задается напрямую, но может быть вычислена через массу и объем формы:
[ = ]
где (m) — масса, (V) — объем тела.
Сила тяжести в Cannon.js задается в метрах на секунду в квадрате, обычно:
world.gravity.set(0, -9.82, 0); // m/s², ось Y вниз
Важно учитывать, что уменьшение масштаба сцены требует пропорционального уменьшения массы и силы тяжести для сохранения реалистичного поведения.
Cannon.js поддерживает несколько типов форм: Box,
Sphere, Cylinder,
ConvexPolyhedron и Trimesh. Масштаб этих форм
напрямую влияет на расчёт столкновений. Рекомендуется соблюдать
следующие правила:
Cannon.js использует явный интегратор Эйлера для движения тел. Малые объекты с большими скоростями или огромные тела с малой массой создают численные ошибки, что приводит к:
Для поддержания стабильной симуляции:
Хотя Cannon.js не отвечает за рендеринг, согласованный масштаб облегчает синхронизацию с графическими движками, например, Three.js:
const geometry = new THREE.BoxGeometry(1, 1, 1); // метр в метре
const material = new THREE.MeshStandardMaterial({color: 0xff0000});
const mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);
mesh.position.copy(body.position); // синхронизация позиции
mesh.quaternion.copy(body.quaternion); // синхронизация ориентации
Нарушение единого масштаба приводит к расхождениям между физикой и визуализацией: объект может “тонуть” в полу или зависать в воздухе.
Для создания стабильных физических сцен в Cannon.js следует:
world.step(timeStep).Соблюдение этих принципов обеспечивает реалистичное и стабильное поведение объектов, упрощает отладку и интеграцию Cannon.js в более крупные проекты с графикой.