Cannon.js — это физический движок на языке JavaScript, разработанный для работы в браузере и Node.js, ориентированный на твердотельную динамику. Его архитектура построена вокруг rigid body physics, что позволяет моделировать объекты с постоянной формой, взаимодействующие через силы, столкновения и ограничения. В отличие от движков общего назначения, Cannon.js не заточен под мягкие тела или жидкости, что делает его лёгким и производительным для симуляций твердых объектов.
Движок реализует интеграцию физических законов Ньютона, учитывая массу, инерцию, трение, столкновения и силы. Все расчёты ведутся с использованием векторной и матричной алгебры, что обеспечивает точность при моделировании движения в трехмерном пространстве.
Cannon.js построен на нескольких базовых сущностях:
World — глобальная среда, в которой находятся все объекты. Она управляет интеграцией, обработкой столкновений и применением внешних сил, таких как гравитация.
Body — объект с массой, инерцией и положением. Может быть динамическим, статическим или кинематическим. Динамические тела подчиняются законам физики, статические — фиксированы, кинематические управляются напрямую, но могут сталкиваться с другими объектами.
Shape — форма тела. Cannon.js поддерживает базовые формы: Box, Sphere, Cylinder, Plane, ConvexPolyhedron, что позволяет строить сложные объекты через комбинацию примитивов.
Constraint — ограничения между объектами, например HingeConstraint, DistanceConstraint, LockConstraint. Они позволяют моделировать соединения, шарниры и пружины.
ContactMaterial и Material — материалы для тел, задающие коэффициенты трения и упругости. Позволяют настраивать поведение столкновений между разными объектами.
Cannon.js использует broadphase и narrowphase алгоритмы для расчёта столкновений:
Механика столкновений учитывает:
Cannon.js применяет метод интеграции Вёрле/Velocity Verlet для обновления позиции и скорости объектов. Основные параметры интеграции:
Использование фиксированного timestep важно для предотвращения нестабильности при быстром движении объектов или малых массе и размерах.
Cannon.js отличается от других популярных JavaScript-движков физики, таких как Ammo.js и Oimo.js, по нескольким параметрам:
Cannon.js часто выбирают для:
Cannon.js хорошо сочетается с графическим движком Three.js, что позволяет визуализировать физику в реальном времени. В типичном цикле:
Такой подход позволяет создавать реалистичные сцены с минимальными усилиями, полностью отделяя физику от визуализации.
Для достижения реалистичного поведения столкновений используется комбинация Material и ContactMaterial. Например:
const groundMaterial = new CANNON.Material("ground");
const ballMaterial = new CANNON.Material("ball");
const contactMaterial = new CANNON.ContactMaterial(
groundMaterial,
ballMaterial,
{ friction: 0.4, restitution: 0.7 }
);
world.addContactMaterial(contactMaterial);
Такой подход позволяет тонко настраивать поведение разных типов поверхностей: скольжение, отскок, трение, без изменения основного тела.
Cannon.js поддерживает различные Constraints, которые управляют относительным движением тел:
Использование ограничений важно для создания сложных механизмов, роботов, подвесок или цепей.
Cannon.js предоставляет инструменты, которые позволяют контролировать баланс между реализмом и производительностью, что делает его удобным для браузерных 3D приложений.