В физическом движке 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);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.