btRigidBodyConstructionInfo: параметры конструктора

btRigidBodyConstructionInfo является ключевым объектом при создании физических тел в Ammo.js. Он инкапсулирует все основные параметры, необходимые для инициализации btRigidBody, включая массу, форму коллизий, физические свойства материала и начальные трансформации. Правильная настройка этого конструктора напрямую влияет на поведение тела в симуляции.


Основной синтаксис

Конструктор принимает следующие параметры:

let rbInfo = new Ammo.btRigidBodyConstructionInfo(
    mass,              // число
    motionState,       // Ammo.btMotionState
    collisionShape,    // Ammo.btCollisionShape
    localInertia       // Ammo.btVector3
);

Пояснение параметров:

  1. mass Определяет массу тела.

    • 0 — тело статическое, неподвижное, будет участвовать только в столкновениях как объект окружающей среды.
    • Любое положительное число — динамическое тело, реагирующее на силы и импульсы.
  2. motionState Представляет интерфейс между физическим миром и графическим отображением. Обычно создается как экземпляр Ammo.btDefaultMotionState. Пример:

    let startTransform = new Ammo.btTransform();
    startTransform.setIdentity();
    startTransform.setOrigin(new Ammo.btVector3(0, 10, 0));
    let motionState = new Ammo.btDefaultMotionState(startTransform);

    motionState обеспечивает синхронизацию позиции и ориентации тела с визуальной сценой.

  3. collisionShape Определяет геометрию коллизий. Ammo.js поддерживает различные формы: btBoxShape, btSphereShape, btCylinderShape, btCapsuleShape, btConvexHullShape и т.д. Пример создания куба:

    let halfExtents = new Ammo.btVector3(1, 1, 1);
    let boxShape = new Ammo.btBoxShape(halfExtents);

    Форма коллизий влияет на физическое взаимодействие с другими объектами: столкновения, скольжение, откаты.

  4. localInertia Вектор типа Ammo.btVector3, описывающий инерцию тела относительно его центра масс.

    • Для статических тел (mass = 0) обычно используется new Ammo.btVector3(0, 0, 0).
    • Для динамических тел инерцию рассчитывают по форме и массе:
    let localInertia = new Ammo.btVector3(0, 0, 0);
    boxShape.calculateLocalInertia(mass, localInertia);

    Точный расчет инерции необходим для реалистичного вращения и устойчивости тела.


Дополнительные свойства через btRigidBodyConstructionInfo

После создания объекта можно настроить дополнительные физические параметры, влияющие на поведение тела в симуляции:

  • m_friction — коэффициент трения поверхности. Пример:

    rbInfo.set_m_friction(0.5);

    Влияет на скольжение по другим объектам.

  • m_restitution — коэффициент упругости при столкновении. Значение 0 полностью поглощает удар, 1 — полностью упругое отражение:

    rbInfo.set_m_restitution(0.8);
  • m_linearDamping и m_angularDamping — демпфирование линейного и углового движения. Позволяет задавать постепенное затухание скорости:

    rbInfo.set_m_linearDamping(0.1);
    rbInfo.set_m_angularDamping(0.1);
  • m_startWorldTransform — начальная трансформация тела, используется, если нужно задать начальное положение и ориентацию до создания btRigidBody.

  • m_motionState — если задается позже, позволяет изменять привязку между физикой и визуальной моделью.


Пример создания динамического куба

let mass = 2;
let startTransform = new Ammo.btTransform();
startTransform.setIdentity();
startTransform.setOrigin(new Ammo.btVector3(0, 5, 0));

let motionState = new Ammo.btDefaultMotionState(startTransform);
let boxShape = new Ammo.btBoxShape(new Ammo.btVector3(1, 1, 1));

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

let rbInfo = new Ammo.btRigidBodyConstructionInfo(mass, motionState, boxShape, localInertia);
rbInfo.set_m_friction(0.6);
rbInfo.set_m_restitution(0.3);

let rigidBody = new Ammo.btRigidBody(rbInfo);

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


Важные нюансы

  • Инерция должна быть рассчитана для всех динамических тел, иначе вращения будут некорректными.
  • MotionState важен для визуальной синхронизации, без него графическая модель будет отставать от физической.
  • Параметры трения и упругости влияют на взаимодействие объектов, и неправильные значения могут привести к “плавающим” телам или чрезмерной энергии после столкновений.
  • Масса = 0 делает тело статическим, но оно по-прежнему участвует в столкновениях, что удобно для пола, стен и других неподвижных объектов.

Эта структура btRigidBodyConstructionInfo обеспечивает полный контроль над созданием физических тел и позволяет точно настраивать их поведение в симуляции Ammo.js.