Rigid body (жёсткое тело) — это основополагающий элемент физического движка Bullet, на котором основана библиотека Ammo.js. В физическом моделировании жёсткое тело рассматривается как объект, сохраняющий форму и размер при воздействии сил, то есть деформации отсутствуют. Ammo.js является портом Bullet на JavaScript через Emscripten, что позволяет применять полную мощь Bullet в браузерных приложениях.
Rigid body в Ammo.js обладает следующими ключевыми свойствами:
Масса (mass) Определяет инерцию объекта. Масса равная нулю делает тело статическим — оно не реагирует на силы и гравитацию. Массовое тело, наоборот, подчиняется законам динамики. Масса влияет на ускорение при воздействии силы согласно закону Ньютона (F = ma).
Форма коллизии (collision shape) В Ammo.js rigid
body создаётся на основе CollisionShape, который определяет геометрию
взаимодействия с другими объектами. Встроенные формы:
BoxShape, SphereShape,
CapsuleShape, CylinderShape,
ConeShape, ConvexHullShape. Выбор формы
критичен для производительности и точности симуляции.
Положение и ориентация (transform) Тело задаётся
трансформацией — положением в пространстве и ориентацией. Ammo.js
использует btTransform для описания этих параметров,
включающую вектор позиции и quaternion для вращения.
Инерционные свойства (local inertia) Для
динамических тел необходимо вычисление инерционного тензора, который
определяет сопротивление вращению. Функция
calculateLocalInertia автоматически рассчитывает его на
основе массы и формы.
Физические параметры Дополнительно rigid body
имеет коэффициенты трения (friction), упругости
(restitution) и линейные/угловые демпферы
(linearDamping, angularDamping), которые
влияют на поведение тела при столкновениях и движении.
Процесс создания включает несколько шагов:
Создание формы коллизии
const shape = new Ammo.btBoxShape(new Ammo.btVector3(1, 1, 1));Вычисление инерции
const mass = 5;
const localInertia = new Ammo.btVector3(0, 0, 0);
shape.calculateLocalInertia(mass, localInertia);Определение трансформации
const transform = new Ammo.btTransform();
transform.setIdentity();
transform.setOrigin(new Ammo.btVector3(0, 10, 0));Создание rigid body
const motionState = new Ammo.btDefaultMotionState(transform);
const rbInfo = new Ammo.btRigidBodyConstructionInfo(mass, motionState, shape, localInertia);
const body = new Ammo.btRigidBody(rbInfo);Rigid body управляется через силы и импульсы:
Линейная сила:
body.applyCentralForce(new Ammo.btVector3(0, 10, 0));Линейный импульс:
body.applyCentralImpulse(new Ammo.btVector3(5, 0, 0));Угловой импульс:
body.applyTorqueImpulse(new Ammo.btVector3(0, 1, 0));Rigid body помещается в btDiscreteDynamicsWorld, который
отвечает за расчёт столкновений, применение гравитации и обновление
позиции объектов. Ammo.js обеспечивает синхронизацию между transform
объекта и физическим состоянием:
const world = new Ammo.btDiscreteDynamicsWorld(dispatcher, broadphase, solver, collisionConfiguration);
world.addRigidBody(body);
Rigid body является основой всех симуляций Bullet и Ammo.js, обеспечивая реалистичное моделирование динамических взаимодействий и физически корректное поведение объектов. С его помощью можно строить сложные системы, от простых падений объектов до симуляции транспортных средств и механических конструкций.