Масса и инерция: btVector3 localInertia

В физическом движке Ammo.js важнейшими характеристиками объекта являются масса и момент инерции. Они определяют, как тело будет реагировать на силы, крутящие моменты и столкновения. Для трёхмерного симулятора динамики крайне важно корректно задавать эти параметры, особенно для объектов с произвольной геометрией.

Масса тела

Масса (mass) в Ammo.js задаётся как числовое значение в килограммах и используется при расчёте линейной динамики объекта. Масса влияет на:

  • Ускорение тела при приложении силы (второй закон Ньютона: F = m * a);
  • Сопротивление при столкновениях с другими объектами;
  • Энергию, передаваемую при импульсных воздействиях.

Объекты с нулевой массой считаются статическими: они не подвержены силам и не двигаются, но участвуют в столкновениях.

let mass = 2; // килограммы

Локальный момент инерции

Момент инерции описывает сопротивление объекта вращению вокруг своих осей. В Ammo.js для хранения локального момента инерции используется структура btVector3, где каждый компонент отвечает за ось X, Y и Z:

  • x — момент инерции относительно оси X;
  • y — момент инерции относительно оси Y;
  • z — момент инерции относительно оси Z.

Для простых геометрических тел, таких как кубы или сферы, Ammo.js позволяет вычислять момент инерции автоматически:

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

Метод calculateLocalInertia(mass, localInertia) принимает массу объекта и ссылку на btVector3. После вызова localInertia содержит корректные значения по трём осям. Для статических объектов (масса = 0) момент инерции остаётся нулевым.

Связь формы тела и инерции

Форма объекта напрямую влияет на распределение массы и, как следствие, на локальный момент инерции:

  • Сфера — одинаковый момент инерции по всем осям (Ix = Iy = Iz);
  • Куб — моменты инерции зависят от размеров: [ I_x = m (h^2 + d^2)] [ I_y = m (w^2 + d^2)] [ I_z = m (w^2 + h^2)] где w, h, d — ширина, высота и глубина куба;
  • Цилиндр — моменты различаются для оси вдоль высоты и перпендикулярных осей.

Ammo.js автоматически учитывает форму через btCollisionShape при вызове calculateLocalInertia.

Применение локального момента инерции

После вычисления localInertia его необходимо передать при создании жёсткого тела (btRigidBody):

let rbInfo = new Ammo.btRigidBodyConstructionInfo(mass, motionState, rigidBodyShape, localInertia);
let rigidBody = new Ammo.btRigidBody(rbInfo);

Важные моменты:

  • Передача корректного localInertia обязательна для динамических тел.
  • Для статических тел или объектов с нулевой массой localInertia игнорируется.
  • Изменение формы тела после создания не обновляет момент инерции автоматически — требуется пересчёт и замена тела.

Управление инерцией вручную

В сложных случаях можно задавать localInertia вручную, если требуется смещённый центр масс или нестандартное распределение массы:

localInertia.setValue(1.0, 2.0, 3.0); // Ix = 1, Iy = 2, Iz = 3

Использование нестандартных значений требует аккуратного тестирования, чтобы избежать неестественных вращений и нестабильности симуляции.

Резюме по ключевым моментам

  • Масса определяет линейное ускорение и динамическое поведение объекта.
  • Локальный момент инерции хранится в btVector3 и отвечает за сопротивление вращению.
  • calculateLocalInertia позволяет корректно вычислить момент инерции для любой формы тела.
  • Передача правильного localInertia в btRigidBodyConstructionInfo критична для реалистичной симуляции.
  • Ручная настройка возможна, но требует понимания физики тела.

Эта модель обеспечивает точное и управляемое поведение динамических объектов, позволяя создавать реалистичные 3D симуляции в браузере с использованием Ammo.js.