Понятие rigid body в контексте Bullet

Rigid body (жёсткое тело) — это основополагающий элемент физического движка Bullet, на котором основана библиотека Ammo.js. В физическом моделировании жёсткое тело рассматривается как объект, сохраняющий форму и размер при воздействии сил, то есть деформации отсутствуют. Ammo.js является портом Bullet на JavaScript через Emscripten, что позволяет применять полную мощь Bullet в браузерных приложениях.

Основные характеристики rigid body

Rigid body в Ammo.js обладает следующими ключевыми свойствами:

  1. Масса (mass) Определяет инерцию объекта. Масса равная нулю делает тело статическим — оно не реагирует на силы и гравитацию. Массовое тело, наоборот, подчиняется законам динамики. Масса влияет на ускорение при воздействии силы согласно закону Ньютона (F = ma).

  2. Форма коллизии (collision shape) В Ammo.js rigid body создаётся на основе CollisionShape, который определяет геометрию взаимодействия с другими объектами. Встроенные формы: BoxShape, SphereShape, CapsuleShape, CylinderShape, ConeShape, ConvexHullShape. Выбор формы критичен для производительности и точности симуляции.

  3. Положение и ориентация (transform) Тело задаётся трансформацией — положением в пространстве и ориентацией. Ammo.js использует btTransform для описания этих параметров, включающую вектор позиции и quaternion для вращения.

  4. Инерционные свойства (local inertia) Для динамических тел необходимо вычисление инерционного тензора, который определяет сопротивление вращению. Функция calculateLocalInertia автоматически рассчитывает его на основе массы и формы.

  5. Физические параметры Дополнительно rigid body имеет коэффициенты трения (friction), упругости (restitution) и линейные/угловые демпферы (linearDamping, angularDamping), которые влияют на поведение тела при столкновениях и движении.

Создание rigid body в Ammo.js

Процесс создания включает несколько шагов:

  1. Создание формы коллизии

    const shape = new Ammo.btBoxShape(new Ammo.btVector3(1, 1, 1));
  2. Вычисление инерции

    const mass = 5;
    const localInertia = new Ammo.btVector3(0, 0, 0);
    shape.calculateLocalInertia(mass, localInertia);
  3. Определение трансформации

    const transform = new Ammo.btTransform();
    transform.setIdentity();
    transform.setOrigin(new Ammo.btVector3(0, 10, 0));
  4. Создание 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

  • Static — масса = 0, не подвержены гравитации, используются для пола, стен, препятствий.
  • Dynamic — масса > 0, подчиняются законам физики, реагируют на силы и столкновения.
  • Kinematic — масса = 0, но перемещаются по заранее заданному пути. Не взаимодействуют динамически, но могут столкнуться с динамическими телами.

Управление rigid body

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);

Особенности симуляции

  • Порядок обновления: сначала вычисляются столкновения, затем применяются силы и импульсы, после чего обновляются позиции.
  • Спящий режим (sleeping): объекты без движения переводятся в спящий режим для оптимизации, что снижает нагрузку на процессор.
  • Стабильность: выбор формы коллизии и корректная масса критичны для предотвращения «пробивания» объектов друг через друга.

Rigid body является основой всех симуляций Bullet и Ammo.js, обеспечивая реалистичное моделирование динамических взаимодействий и физически корректное поведение объектов. С его помощью можно строить сложные системы, от простых падений объектов до симуляции транспортных средств и механических конструкций.