btBoxShape — это один из основных классов библиотеки
Ammo.js, предназначенный для представления коробочных коллайдеров в
физическом мире. Данный класс используется для создания ограничивающих
примитивов в форме прямоугольных параллелепипедов, что обеспечивает
простую и эффективную обработку столкновений.
Создание объекта btBoxShape осуществляется через
конструктор:
let boxShape = new Ammo.btBoxShape(halfExtents);
Параметр halfExtents задает половину
размеров коробки по каждой оси (X, Y, Z). Типично это вектор
btVector3:
let halfExtents = new Ammo.btVector3(1, 2, 0.5);
let boxShape = new Ammo.btBoxShape(halfExtents);
Использование половинных размеров связано с внутренними алгоритмами физического движка Bullet, на котором основан Ammo.js, где коллайдеры позиционируются относительно центра тела.
btBoxShapeПосле создания объекта доступны методы для управления и получения информации о форме:
getHalfExtentsWithMargin() Возвращает размеры
коробки с учётом внутреннего зазора (margin), который
используется для повышения стабильности симуляции:
let extentsWithMargin = boxShape.getHalfExtentsWithMargin();
console.log(extentsWithMargin.x(), extentsWithMargin.y(), extentsWithMargin.z());setMargin(margin) Позволяет задать
дополнительный зазор вокруг коллайдера. По умолчанию
margin = 0.04:
boxShape.setMargin(0.05);getMargin() Получает текущий маржин:
let margin = boxShape.getMargin();btRigidBodyДля того чтобы коробка начала участвовать в симуляции физики, её
нужно присвоить телу (btRigidBody). Пример создания
динамического тела с использованием btBoxShape:
let mass = 5;
let isDynamic = (mass !== 0);
let localInertia = new Ammo.btVector3(0, 0, 0);
if (isDynamic) {
boxShape.calculateLocalInertia(mass, localInertia);
}
let startTransform = new Ammo.btTransform();
startTransform.setIdentity();
startTransform.setOrigin(new Ammo.btVector3(0, 10, 0));
let motionState = new Ammo.btDefaultMotionState(startTransform);
let rbInfo = new Ammo.btRigidBodyConstructionInfo(mass, motionState, boxShape, localInertia);
let body = new Ammo.btRigidBody(rbInfo);
Особенности расчёта инерции: Метод
calculateLocalInertia(mass, inertia) автоматически
вычисляет тензор инерции для коробки, что важно для правильного
поведения тела при вращении и столкновениях. Для статических объектов
(mass = 0) инерция остаётся нулевой.
Изменение размеров уже созданного btBoxShape напрямую
невозможно. Для модификации требуется создать новый объект с новыми
параметрами. Для перемещения или вращения тела используются методы
btRigidBody через его motionState:
let transform = new Ammo.btTransform();
transform.setIdentity();
transform.setOrigin(new Ammo.btVector3(5, 0, 0));
body.setWorldTransform(transform);
btBoxShape для простых геометрий — это
наиболее производительный вариант среди всех коллайдеров Ammo.js.margin, особенно при динамических
столкновениях, чтобы избежать “залипаний” тел.btBoxShape в btCompoundShape, что позволяет
формировать произвольные формы с минимальной нагрузкой на физический
движок.btCompoundShape можно объединять несколько коробок для
более сложной формы.Использование btBoxShape обеспечивает баланс между
производительностью и точностью, что делает его ключевым инструментом
при моделировании прямоугольных объектов в симуляциях на базе
Ammo.js.