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

Библиотека Cannon.js реализует физический движок для JavaScript, предоставляя средства для симуляции твердых тел с учетом законов Ньютона. Одними из ключевых параметров, определяющих поведение тел, являются масса и момент инерции. Эти величины напрямую влияют на движение объектов под действием сил и на их реакцию при столкновениях.


Масса тела

Масса (mass) задается в килограммах и отражает сопротивление тела ускорению при приложении силы. В Cannon.js масса является обязательным параметром при создании динамических тел:

const body = new CANNON.Body({
    mass: 5, // кг
    shape: new CANNON.Sphere(1) // радиус 1
});

Ключевые моменты:

  • Масса равная нулю (mass: 0) делает тело статическим, оно не реагирует на силы и не перемещается под действием физики.
  • Масса влияет на взаимодействие тел при столкновениях: при контакте тела с разной массой более тяжелое тело изменяет скорость меньше.
  • Для тел с переменной массой необходимо вручную пересчитывать их момент инерции (см. ниже).

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

Момент инерции (inertia) описывает сопротивление тела вращению относительно осей. Для простых форм Cannon.js автоматически вычисляет момент инерции, исходя из формы и массы:

body.updateMassProperties();

Особенности момента инерции:

  • Для сфер момент инерции равен ( I = m r^2 ), где m — масса, r — радиус.
  • Для кубов ( I = m (h^2 + w^2) ) для каждой из осей.
  • В Cannon.js можно задавать индивидуальные значения для каждой оси через свойство inertia:
body.inertia.set(1, 1, 1); // отдельные значения по X, Y, Z
body.invInertia.set(
    1 / body.inertia.x,
    1 / body.inertia.y,
    1 / body.inertia.z
);
  • После изменения массы или момента инерции необходимо вызвать updateMassProperties(), чтобы физический движок правильно пересчитал внутренние параметры.

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

Масса и момент инерции тесно связаны через формулы для различных форм тел. Cannon.js использует стандартные формулы для:

  • Сферы: момент инерции пропорционален массе и квадрату радиуса.
  • Цилиндра и коробки: зависит от массы и размеров вдоль соответствующих осей.
  • Произвольной формы (ConvexPolyhedron): момент инерции рассчитывается через разбиение на примитивы или задается вручную.

Неверное определение массы или момента инерции может привести к неестественному поведению тел, например:

  • Сфера с малой массой и большим моментом инерции вращается слишком медленно.
  • Тяжелый куб с маленьким моментом инерции «крутится как перышко» при столкновении.

Практическое использование

  1. Создание динамических тел с корректной физикой:
const box = new CANNON.Body({
    mass: 2,
    shape: new CANNON.Box(new CANNON.Vec3(1, 1, 1))
});
box.position.set(0, 5, 0);
box.updateMassProperties();
  1. Обновление массы после изменений:
box.mass = 5;
box.updateMassProperties();
  1. Настройка момента инерции вручную (для нестандартных форм):
box.inertia.set(2, 3, 4);
box.invInertia.set(
    1 / box.inertia.x,
    1 / box.inertia.y,
    1 / box.inertia.z
);
  1. Влияние на столкновения:
  • Масса тяжелого тела влияет на импульс, передаваемый при ударе.
  • Момент инерции влияет на скорость вращения после столкновения.

Оптимизация физических симуляций

  • Статические объекты: mass = 0 используют меньше ресурсов, не требуют пересчета инерции.
  • Симметричные тела: можно позволить Cannon.js автоматически вычислять момент инерции.
  • Динамические тела с изменяемой массой: важно каждый раз вызывать updateMassProperties() после изменения mass или inertia.

Взаимодействие с другими параметрами

  • Силы и ускорения: F = m * a напрямую зависит от массы.
  • Импульсы при столкновении: учитывают как массу, так и момент инерции.
  • Трение и коэффициент восстановления: корректно работают только при правильных массе и моменте инерции.

Масса и момент инерции в Cannon.js являются фундаментальными параметрами, от которых зависит реалистичность симуляции. Правильная настройка этих величин обеспечивает физически достоверное поведение объектов, управляемое законом Ньютона, с естественными ускорениями и вращениями.