btMultiSphereShape — это специализированная геометрическая форма в физическом движке Bullet, реализованная в Ammo.js для JavaScript. Она предназначена для представления сложных объектов как объединения нескольких сфер. Такой подход позволяет создавать приближённые коллизии сложных форм без необходимости строить детализированные меши, что значительно снижает вычислительные затраты.
Форма создаётся с помощью конструктора:
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);
btVector3,
определяющих центры сфер относительно локальной системы координат
объекта.Важно: длины массивов 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);
Форма 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);
Динамический объект будет корректно реагировать на силы и столкновения благодаря вычисленной локальной инерции.
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 позволяет создавать динамические, приближённые коллизионные формы, сочетая простоту сферической модели и эффективность вычислений. Эта форма является оптимальным выбором для быстрого прототипирования физических объектов и для объектов, где точная геометрия не требуется для физических расчётов.