btMultiSphereShape

btMultiSphereShape — это специализированная геометрическая форма в физическом движке Bullet, реализованная в Ammo.js для JavaScript. Она предназначена для представления сложных объектов как объединения нескольких сфер. Такой подход позволяет создавать приближённые коллизии сложных форм без необходимости строить детализированные меши, что значительно снижает вычислительные затраты.


Создание объекта btMultiSphereShape

Форма создаётся с помощью конструктора:

let positions = [
    new Ammo.btVector3(0, 0, 0),
    new Ammo.btVector3(1, 0, 0),
    new Ammo.btVector3(0, 1, 0)
];

let radii = [0.5, 0.5, 0.3];

let multiSphereShape = new Ammo.btMultiSphereShape(positions, radii, positions.length);
  • positions — массив векторов btVector3, определяющих центры сфер относительно локальной системы координат объекта.
  • radii — массив радиусов соответствующих сфер.
  • positions.length — количество сфер.

Важно: длины массивов positions и radii должны совпадать.


Основные свойства и методы

btMultiSphereShape наследует функциональность базового btConvexShape, что позволяет использовать стандартные методы для работы с коллизиями и физическим движением.

  • getNumPoints() — возвращает количество сфер, составляющих форму.
  • getSpherePosition(index) — возвращает позицию сферы с указанным индексом.
  • getSphereRadius(index) — возвращает радиус конкретной сферы.
  • calculateLocalInertia(mass, inertia) — вычисляет момент инерции для объекта с заданной массой.

Пример вычисления инерции:

let mass = 2;
let inertia = new Ammo.btVector3(0, 0, 0);
multiSphereShape.calculateLocalInertia(mass, inertia);

Интеграция с rigid body

Форма btMultiSphereShape может быть использована для создания динамических объектов:

let transform = new Ammo.btTransform();
transform.setIdentity();
transform.setOrigin(new Ammo.btVector3(0, 10, 0));

let motionState = new Ammo.btDefaultMotionState(transform);

let mass = 1;
let localInertia = new Ammo.btVector3(0, 0, 0);
multiSphereShape.calculateLocalInertia(mass, localInertia);

let rbInfo = new Ammo.btRigidBodyConstructionInfo(mass, motionState, multiSphereShape, localInertia);
let rigidBody = new Ammo.btRigidBody(rbInfo);

Динамический объект будет корректно реагировать на силы и столкновения благодаря вычисленной локальной инерции.


Преимущества использования btMultiSphereShape

  1. Производительность: объединение сфер вместо сложных мешей значительно уменьшает нагрузку на физический движок.
  2. Простота конфигурации: добавление или изменение сфер осуществляется путём изменения массивов позиций и радиусов.
  3. Совместимость с другими объектами Ammo.js: может взаимодействовать с любыми rigid body и триангулярными мешами.
  4. Точность приближения: при правильной конфигурации позволяет моделировать коллизии сложных форм с минимальной потерей реалистичности.

Особенности применения

  • Составные объекты: btMultiSphereShape удобно использовать для объектов типа персонажей или инструментов, где тело можно приближённо описать сферическим каркасом.
  • Динамика с малыми массами: для очень лёгких объектов необходимо корректно подбирать радиусы и позиции сфер, чтобы избежать нестабильности симуляции.
  • Комбинация с другими формами: можно объединять btMultiSphereShape с btCompoundShape для создания гибридных коллизионных форм.

Пример комбинированной формы:

let compound = new Ammo.btCompoundShape();
compound.addChildShape(new Ammo.btTransform(), multiSphereShape);

let boxShape = new Ammo.btBoxShape(new Ammo.btVector3(1, 1, 1));
compound.addChildShape(new Ammo.btTransform(), boxShape);

Рекомендации по оптимизации

  • Использовать минимально необходимое количество сфер для приближения формы.
  • Центры сфер располагать так, чтобы перекрытия были минимальными, иначе расчёт коллизий станет менее эффективным.
  • Для статических объектов можно задавать массу равной нулю, что снимает необходимость вычисления локальной инерции.
  • При сложных движениях объектов с btMultiSphereShape следует учитывать, что поведение коллизий может слегка отличаться от точных мешевых форм, особенно при сильных контактных взаимодействиях.

Итоговое использование

btMultiSphereShape позволяет создавать динамические, приближённые коллизионные формы, сочетая простоту сферической модели и эффективность вычислений. Эта форма является оптимальным выбором для быстрого прототипирования физических объектов и для объектов, где точная геометрия не требуется для физических расчётов.