Библиотека Ammo.js представляет собой порт Bullet Physics Engine на JavaScript, обеспечивая полноценную поддержку физического моделирования твердых тел. Одной из ключевых составляющих физического движка является работа с формами (shapes), которые определяют геометрию объектов в симуляции. Формы служат основой для расчета столкновений, инерции и взаимодействий тел в мире.
В Ammo.js существует строгая иерархия классов форм, основанная на наследовании, что позволяет создавать как простые, так и составные формы. Основные базовые классы форм включают в себя:
btCollisionShape является абстрактным базовым классом для всех форм в Ammo.js. Он предоставляет общий интерфейс для расчета границ, инерции и обработки столкновений.
Ключевые методы:
calculateLocalInertia(mass, inertia) — вычисляет тензор
инерции для заданной массы.setMargin(margin) и getMargin() —
установка и получение margin, буфера вокруг формы для
более стабильного расчета столкновений.getBoundingSphere(radius, center) — получение сферы,
полностью содержащей форму, полезно для грубой фильтрации
столкновений.Все конкретные формы наследуют этот класс и реализуют свои методы для специфических геометрий.
Примитивные формы — это основные строительные блоки для создания физических тел. К ним относятся:
btBoxShape Определяет прямоугольный
параллелепипед. Конструктор принимает вектор размеров
halfExtents. Пример:
const halfExtents = new Ammo.btVector3(1, 2, 3);
const boxShape = new Ammo.btBoxShape(halfExtents);btSphereShape Создает сферическую форму, принимая один параметр — радиус. Пример:
const sphereShape = new Ammo.btSphereShape(1.5);btCylinderShape Определяет цилиндр, ориентированный вдоль оси Y по умолчанию. Конструктор принимает вектор радиусов и высоты. Пример:
const cylinderShape = new Ammo.btCylinderShape(new Ammo.btVector3(1, 2, 1));btCapsuleShape и btCapsuleShapeX/Z Капсульная форма, полезная для персонажей и скользящих объектов. Различие заключается в оси ориентации (Y, X, Z).
btConeShape Создает конус с заданным радиусом основания и высотой. Поддерживает различные ориентации через btConeShapeX/Z.
Все примитивные формы оптимизированы для быстрого расчета столкновений и являются самыми легкими по вычислительной нагрузке.
Для более сложных объектов Ammo.js предоставляет классы для комбинирования нескольких форм:
btCompoundShape Позволяет объединять несколько форм в один объект с локальными смещениями и ориентациями. Это ключевой класс для создания сложных тел, состоящих из примитивов.
Пример использования:
const compound = new Ammo.btCompoundShape();
const box = new Ammo.btBoxShape(new Ammo.btVector3(1,1,1));
const transform = new Ammo.btTransform();
transform.setIdentity();
transform.setOrigin(new Ammo.btVector3(0, 2, 0));
compound.addChildShape(transform, box);btConvexHullShape Представляет собой форму, построенную из произвольного множества точек, создавая выпуклую оболочку. Подходит для неровных объектов без необходимости ручного составления составной формы.
Особенности:
addPoint(vector, recalcLocalAabb) позволяет
добавлять вершины.btBvhTriangleMeshShape Для статических мешей используется эта форма. Она строит BVH (Bounding Volume Hierarchy) для ускорения поиска столкновений с большими моделями.
Ammo.js также включает вспомогательные формы для специфических задач:
Структура классов форм в Ammo.js выглядит следующим образом (упрощенно):
btCollisionShape
├── btBoxShape
├── btSphereShape
├── btCylinderShape
├── btCapsuleShape
├── btConeShape
├── btCompoundShape
├── btConvexHullShape
├── btBvhTriangleMeshShape
├── btStaticPlaneShape
├── btHeightfieldTerrainShape
└── btScaledBvhTriangleMeshShape
Каждая конкретная форма реализует методы базового класса и может быть использована в составе btRigidBody для динамических или статических объектов.
Иерархия форм в Ammo.js задает четкую основу для построения как простых, так и сложных физически корректных объектов, обеспечивая гибкость и высокую производительность в симуляциях.