Масса и момент инерции: автоматический и ручной расчёт

В Oimo.js управление физикой объектов основывается на точных вычислениях массы, распределения массы и момента инерции. Эти параметры определяют, как объекты реагируют на силы, столкновения и вращение. Правильная настройка массы и момента инерции критически важна для реалистичного поведения в симуляции.


Автоматический расчёт массы и момента инерции

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

Принципы автоматического расчёта:

  • Масса объекта вычисляется как произведение плотности на объём объекта:

    mass = density * volume
  • Момент инерции рассчитывается с учётом формы объекта и его ориентации в пространстве. Для стандартных примитивов Oimo.js использует известные формулы физики:

    • Куб:

      Ixx = (1/12) * mass * (height^2 + depth^2)
      Iyy = (1/12) * mass * (width^2 + depth^2)
      Izz = (1/12) * mass * (width^2 + height^2)
    • Сфера:

      I = (2/5) * mass * radius^2
    • Цилиндр (ось вдоль Y):

      Ixx = Izz = (1/12) * mass * (3*radius^2 + height^2)
      Iyy = (1/2) * mass * radius^2

Пример создания тела с автоматическим расчётом:

let box = new OIMO.Body({
    type: 'box',
    size: [2, 1, 3],
    pos: [0, 5, 0],
    move: true,
    density: 1 // плотность, используемая для расчёта массы
});

В этом случае Oimo.js автоматически вычислит массу и момент инерции на основе размеров [2, 1, 3] и плотности 1.


Ручной расчёт массы и момента инерции

Иногда требуется точный контроль над массой и распределением массы, особенно для сложных форм или нестандартных объектов. В Oimo.js это реализуется через установку свойств mass и inertia вручную.

Масса

  • Свойство mass задаёт суммарную массу тела.
  • Оно влияет на динамику: ускорение под действием силы вычисляется через ( a = F/m ).

Момент инерции

  • Свойство inertia задаёт момент инерции относительно трёх осей:

    inertia: [Ixx, Iyy, Izz]
  • В отличие от автоматического расчёта, ручная установка позволяет учитывать нестандартное распределение массы, например, если масса сосредоточена в одном конце объекта.

Пример ручного задания массы и инерции:

let customBody = new OIMO.Body({
    type: 'box',
    size: [1, 2, 1],
    pos: [0, 3, 0],
    move: true,
    mass: 5,
    inertia: [2, 3, 2]
});

Здесь объект будет иметь массу 5 единиц, а вращение вокруг осей X, Y, Z будет ограничено моментами инерции 2, 3, 2. Это важно для контроля стабильности в динамических симуляциях.


Влияние формы и распределения массы

  1. Простые примитивы Автоматический расчёт подходит для кубов, сфер, цилиндров — объекты ведут себя предсказуемо, момент инерции соответствует стандартным формулам.

  2. Сложные объекты Если объект составной (несколько мешей или нестандартная геометрия), автоматический расчёт может дать некорректные результаты. В таких случаях рекомендуется:

    • Разбить объект на примитивы и задать массы каждой части.
    • Суммировать массу и вычислять момент инерции вручную с учётом центра масс.
  3. Центр масс Расположение центра масс влияет на вращение. Даже при корректной массе и моменте инерции, если центр масс смещён, объект будет вращаться несимметрично. В Oimo.js можно управлять центром масс через setMassData(center, mass, inertia) для сложных случаев.


Настройка плотности для автоматического расчёта

  • Плотность (density) задаёт отношение массы к объёму.
  • Для более тяжёлых объектов увеличивается плотность.
  • Для лёгких объектов достаточно малой плотности.

Пример изменения плотности куба:

box.density = 2; // масса автоматически увеличится в 2 раза
box.updateMassData(); // пересчёт массы и инерции

Метод updateMassData() необходим, чтобы пересчитать массу и момент инерции после изменения плотности или размеров объекта.


Использование в динамических симуляциях

  • Низкая масса и маленький момент инерции → объект быстро реагирует на силы, легко вращается.
  • Высокая масса и большой момент инерции → объект устойчив к воздействию, медленно вращается.
  • Неправильный момент инерции → объект может вести себя неестественно, например, “срываться” при столкновениях или вращении.

Правильное сочетание массы, момента инерции и центра масс обеспечивает реалистичную динамику.


Сравнение автоматического и ручного расчёта

Характеристика Автоматический расчёт Ручной расчёт
Простота использования Высокая Средняя
Точность для стандартных форм Высокая Не требуется
Контроль над распределением массы Низкий Полный
Подходит для сложных форм Ограниченно Да
Пересчёт при изменении формы Автоматический при методе updateMassData Требуется ручной пересчёт

Автоматический и ручной расчёт массы и момента инерции в Oimo.js являются основой для точной физики. Понимание этих принципов позволяет создавать реалистичные симуляции и управлять поведением объектов в любых условиях.