В 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^2let 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 задаёт суммарную массу тела.Свойство 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. Это важно для контроля стабильности в динамических
симуляциях.
Простые примитивы Автоматический расчёт подходит для кубов, сфер, цилиндров — объекты ведут себя предсказуемо, момент инерции соответствует стандартным формулам.
Сложные объекты Если объект составной (несколько мешей или нестандартная геометрия), автоматический расчёт может дать некорректные результаты. В таких случаях рекомендуется:
Центр масс Расположение центра масс влияет на
вращение. Даже при корректной массе и моменте инерции, если центр масс
смещён, объект будет вращаться несимметрично. В Oimo.js можно управлять
центром масс через setMassData(center, mass, inertia) для
сложных случаев.
density) задаёт отношение массы к
объёму.Пример изменения плотности куба:
box.density = 2; // масса автоматически увеличится в 2 раза
box.updateMassData(); // пересчёт массы и инерции
Метод updateMassData() необходим, чтобы пересчитать
массу и момент инерции после изменения плотности или размеров
объекта.
Правильное сочетание массы, момента инерции и центра масс обеспечивает реалистичную динамику.
| Характеристика | Автоматический расчёт | Ручной расчёт |
|---|---|---|
| Простота использования | Высокая | Средняя |
| Точность для стандартных форм | Высокая | Не требуется |
| Контроль над распределением массы | Низкий | Полный |
| Подходит для сложных форм | Ограниченно | Да |
| Пересчёт при изменении формы | Автоматический при методе updateMassData | Требуется ручной пересчёт |
Автоматический и ручной расчёт массы и момента инерции в Oimo.js являются основой для точной физики. Понимание этих принципов позволяет создавать реалистичные симуляции и управлять поведением объектов в любых условиях.