Единицы измерения и масштаб сцены

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

Масштаб сцены

Масштаб сцены влияет на стабильность интегратора и точность столкновений. В Cannon.js существует ряд практических ограничений:

  • Минимальный размер объектов не должен быть меньше ~0.1 единицы. Объекты слишком маленького размера могут создавать нестабильные силы контакта.
  • Максимальный размер объектов рекомендуется держать в пределах ~10–20 единиц. Слишком крупные объекты увеличивают погрешность вычислений столкновений и могут вызвать “проникновение” тел друг в друга.
  • Равномерность масштабов. Если одна ось сцены сильно отличается по величине от других (например, одна сторона 100, другая 1), интегратор может терять точность, что проявляется в дрожании или нестабильном поведении объектов.

Масса и плотность

Масса объектов в Cannon.js задается напрямую в килограммах, но важно учитывать соотношение массы и размеров:

const sphereBody = new CANNON.Body({
    mass: 5, // кг
    shape: new CANNON.Sphere(1) // радиус в метрах
});
  • Малые массы в больших объектах делают систему крайне чувствительной к столкновениям.
  • Слишком большие массы при малом размере вызывают резкие ускорения, что приводит к нестабильной симуляции.

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

  • куб 1×1×1 м — масса 1–10 кг
  • сфера радиусом 0.5 м — масса 0.5–5 кг

Плотность объектов не задается напрямую, но может быть вычислена через массу и объем формы:

[ = ]

где (m) — масса, (V) — объем тела.

Влияние силы тяжести

Сила тяжести в Cannon.js задается в метрах на секунду в квадрате, обычно:

world.gravity.set(0, -9.82, 0); // m/s², ось Y вниз

Важно учитывать, что уменьшение масштаба сцены требует пропорционального уменьшения массы и силы тяжести для сохранения реалистичного поведения.

  • Малые объекты при стандартной гравитации ускоряются слишком быстро и могут “пролетать” сквозь другие тела.
  • Объекты большого масштаба при стандартной гравитации ощущают слишком слабую или сильную гравитацию, что нарушает физическую реалистичность.

Размеры коллайдеров

Cannon.js поддерживает несколько типов форм: Box, Sphere, Cylinder, ConvexPolyhedron и Trimesh. Масштаб этих форм напрямую влияет на расчёт столкновений. Рекомендуется соблюдать следующие правила:

  1. Box: минимальный размер 0.1, оптимальный 0.5–5.
  2. Sphere: радиус не меньше 0.1, желательно 0.2–2.
  3. Cylinder: высота и радиус должны быть согласованы с другими объектами сцены.
  4. Trimesh: требует аккуратного масштабирования, так как слишком маленькие треугольники создают нестабильные контактные точки.

Влияние масштаба на интеграцию

Cannon.js использует явный интегратор Эйлера для движения тел. Малые объекты с большими скоростями или огромные тела с малой массой создают численные ошибки, что приводит к:

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

Для поддержания стабильной симуляции:

  • Варьировать timeStep вместе с масштабом объектов: малые объекты требуют меньшего шага интеграции (например, 1/120 s).
  • Поддерживать масштаб тел в пределах 0.1–10 единиц.
  • Соответственно подбирать массу и силу тяжести.

Масштаб и визуализация

Хотя 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 следует:

  • Использовать метрическую систему: метры, килограммы, секунды.
  • Держать размеры объектов между 0.1 и 10 единиц.
  • Соразмерно подбирать массы и силы.
  • Контролировать шаг интеграции world.step(timeStep).
  • Проверять визуальную синхронизацию с рендерером при изменении масштаба.

Соблюдение этих принципов обеспечивает реалистичное и стабильное поведение объектов, упрощает отладку и интеграцию Cannon.js в более крупные проекты с графикой.