btRigidBodyConstructionInfo является ключевым объектом
при создании физических тел в Ammo.js. Он инкапсулирует все основные
параметры, необходимые для инициализации btRigidBody,
включая массу, форму коллизий, физические свойства материала и начальные
трансформации. Правильная настройка этого конструктора напрямую влияет
на поведение тела в симуляции.
Конструктор принимает следующие параметры:
let rbInfo = new Ammo.btRigidBodyConstructionInfo(
mass, // число
motionState, // Ammo.btMotionState
collisionShape, // Ammo.btCollisionShape
localInertia // Ammo.btVector3
);
mass Определяет массу тела.
0 — тело статическое, неподвижное, будет участвовать
только в столкновениях как объект окружающей среды.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 обеспечивает синхронизацию позиции и
ориентации тела с визуальной сценой.
collisionShape Определяет геометрию
коллизий. Ammo.js поддерживает различные формы: btBoxShape,
btSphereShape, btCylinderShape,
btCapsuleShape, btConvexHullShape и т.д.
Пример создания куба:
let halfExtents = new Ammo.btVector3(1, 1, 1);
let boxShape = new Ammo.btBoxShape(halfExtents);
Форма коллизий влияет на физическое взаимодействие с другими объектами: столкновения, скольжение, откаты.
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, который сразу готов для добавления в физический мир.
Эта структура btRigidBodyConstructionInfo обеспечивает
полный контроль над созданием физических тел и позволяет точно
настраивать их поведение в симуляции Ammo.js.