Cannon.js — это физический движок для Javascript, реализующий тела с твердой динамикой (rigid bodies), контакты и столкновения, а также систему интеграции движения во времени. Он ориентирован на реалистичное моделирование физики объектов в 3D-пространстве и предоставляет гибкие инструменты для настройки физических параметров.
В основе архитектуры лежат три ключевых компонента: мир (World), тела (Body) и формы (Shape). Эти элементы взаимодействуют через силы, импульсы и коллизии, обеспечивая корректное поведение объектов.
World — центральный объект, управляющий симуляцией. Он
хранит список всех тел, осуществляет пошаговое обновление состояния и
обрабатывает столкновения. Основные свойства и методы:
CANNON.Vec3), задающий направление и величину силы тяжести
для всех объектов.NaiveBroadphase,
SAPBroadphase).dt. Позволяет
точно интегрировать движение при переменных частотах кадров.World отвечает за сбор всех
столкновений, генерацию контактных точек и передачу их в
систему constraint solver, что обеспечивает
реалистичное взаимодействие объектов.
Body представляет собой физический
объект, обладающий массой, инерцией и положением в
пространстве. Основные параметры:
0 делает
объект статическим.CANNON.Vec3).Методы Body включают:
Тела могут быть статическими, динамическими или кинематическими, что задаёт правила их взаимодействия с другими объектами.
Shape определяет геометрию тела для
расчета столкновений. Cannon.js предоставляет несколько типов форм:
Каждая форма хранит информацию о массе, позиции относительно тела и инерции, что позволяет создавать составные тела с несколькими формами.
Cannon.js использует двухступенчатый процесс столкновений:
NaiveBroadphase и
SAPBroadphase оптимизируют поиск потенциальных
контактов.Контакты обрабатываются solver-ом, который вычисляет силы реакции для предотвращения проникновения тел друг в друга и моделирования трения.
Ограничения позволяют связывать тела и ограничивать их движение:
Constraints используют Lagrange multiplier solver, что обеспечивает точное соблюдение ограничений без нарушения физической реалистичности.
Cannon.js применяет интегратор Velocity Verlet, обеспечивающий баланс между стабильностью и точностью. При каждом шаге:
Для динамики объектов с высокой скоростью можно увеличивать
maxSubSteps, чтобы избежать транзитного
проникновения.
Библиотека построена модульно:
World, Body,
Shape, Solver,
ContactEquation.SAPBroadphase вместо
NaiveBroadphase значительно снижает количество проверок
столкновений для больших сцен.Trimesh следует использовать только для сложных, редко
двигающихся объектов из-за высокой нагрузки на Narrowphase.Cannon.js не занимается рендерингом. Он предоставляет позиции и ориентации объектов, которые можно использовать совместно с библиотеками визуализации, такими как:
Состояние тел обновляется в реальном времени, что позволяет синхронизировать физику и графику, создавая плавную и реалистичную анимацию.
Эта архитектура делает Cannon.js мощным инструментом для 3D-физики в браузере, позволяя моделировать динамические сцены с широким спектром взаимодействий, обеспечивая контроль над производительностью и реалистичностью симуляции.