btBoxShape: параметры и создание

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);
  • X — половина ширины коробки
  • Y — половина высоты
  • Z — половина глубины

Использование половинных размеров связано с внутренними алгоритмами физического движка 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.