Обзор иерархии классов форм

Библиотека Ammo.js представляет собой порт Bullet Physics Engine на JavaScript, обеспечивая полноценную поддержку физического моделирования твердых тел. Одной из ключевых составляющих физического движка является работа с формами (shapes), которые определяют геометрию объектов в симуляции. Формы служат основой для расчета столкновений, инерции и взаимодействий тел в мире.

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


btCollisionShape

btCollisionShape является абстрактным базовым классом для всех форм в Ammo.js. Он предоставляет общий интерфейс для расчета границ, инерции и обработки столкновений.

Ключевые методы:

  • calculateLocalInertia(mass, inertia) — вычисляет тензор инерции для заданной массы.
  • setMargin(margin) и getMargin() — установка и получение margin, буфера вокруг формы для более стабильного расчета столкновений.
  • getBoundingSphere(radius, center) — получение сферы, полностью содержащей форму, полезно для грубой фильтрации столкновений.

Все конкретные формы наследуют этот класс и реализуют свои методы для специфических геометрий.


Примитивные формы

Примитивные формы — это основные строительные блоки для создания физических тел. К ним относятся:

  1. btBoxShape Определяет прямоугольный параллелепипед. Конструктор принимает вектор размеров halfExtents. Пример:

    const halfExtents = new Ammo.btVector3(1, 2, 3);
    const boxShape = new Ammo.btBoxShape(halfExtents);
  2. btSphereShape Создает сферическую форму, принимая один параметр — радиус. Пример:

    const sphereShape = new Ammo.btSphereShape(1.5);
  3. btCylinderShape Определяет цилиндр, ориентированный вдоль оси Y по умолчанию. Конструктор принимает вектор радиусов и высоты. Пример:

    const cylinderShape = new Ammo.btCylinderShape(new Ammo.btVector3(1, 2, 1));
  4. btCapsuleShape и btCapsuleShapeX/Z Капсульная форма, полезная для персонажей и скользящих объектов. Различие заключается в оси ориентации (Y, X, Z).

  5. btConeShape Создает конус с заданным радиусом основания и высотой. Поддерживает различные ориентации через btConeShapeX/Z.

Все примитивные формы оптимизированы для быстрого расчета столкновений и являются самыми легкими по вычислительной нагрузке.


Составные и сложные формы

Для более сложных объектов Ammo.js предоставляет классы для комбинирования нескольких форм:

  1. 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);
  2. btConvexHullShape Представляет собой форму, построенную из произвольного множества точек, создавая выпуклую оболочку. Подходит для неровных объектов без необходимости ручного составления составной формы.

    Особенности:

    • Метод addPoint(vector, recalcLocalAabb) позволяет добавлять вершины.
    • Расчет инерции и столкновений выполняется автоматически.
  3. btBvhTriangleMeshShape Для статических мешей используется эта форма. Она строит BVH (Bounding Volume Hierarchy) для ускорения поиска столкновений с большими моделями.

    • Используется для объектов без динамики (масса = 0).
    • Поддерживает сложные модели с тысячами треугольников.

Вспомогательные формы и утилиты

Ammo.js также включает вспомогательные формы для специфических задач:

  • btStaticPlaneShape — бесконечная плоскость, обычно для пола или стен.
  • btHeightfieldTerrainShape — форма, созданная на основе карты высот, оптимальна для симуляции ландшафта.
  • btScaledBvhTriangleMeshShape — масштабирование сложной треугольной сетки без пересчета BVH.

Иерархия наследования

Структура классов форм в Ammo.js выглядит следующим образом (упрощенно):

btCollisionShape
├── btBoxShape
├── btSphereShape
├── btCylinderShape
├── btCapsuleShape
├── btConeShape
├── btCompoundShape
├── btConvexHullShape
├── btBvhTriangleMeshShape
├── btStaticPlaneShape
├── btHeightfieldTerrainShape
└── btScaledBvhTriangleMeshShape

Каждая конкретная форма реализует методы базового класса и может быть использована в составе btRigidBody для динамических или статических объектов.


Ключевые моменты при работе с формами

  • Выбор формы влияет на производительность: примитивы обрабатываются быстрее, чем сложные меши.
  • Margin: всегда задается небольшое значение (обычно 0.04), чтобы улучшить стабильность столкновений.
  • Составные формы позволяют создавать сложные тела без необходимости писать собственный алгоритм столкновений.
  • Выпуклость: только выпуклые формы корректно взаимодействуют с динамическими телами. Невыпуклые формы обычно используются для статических объектов через BVH.

Иерархия форм в Ammo.js задает четкую основу для построения как простых, так и сложных физически корректных объектов, обеспечивая гибкость и высокую производительность в симуляциях.