В библиотеке Oimo.js физическое тело
(RigidBody) может быть составным, объединяющим несколько
геометрических форм (Shape). Это позволяет создавать
сложные объекты с разнообразной физикой, которые невозможно
смоделировать одной простой формой. Каждая форма добавляется к телу
независимо, при этом сохраняются общие свойства массы, инерции и
взаимодействия с другими объектами сцены.
Ключевой момент — каждая форма имеет локальные параметры относительно тела: позицию, ориентацию и свойства материала (жесткость, трение, упругость). Тело воспринимается как единый объект, но физический движок учитывает каждую форму при расчёте столкновений, реакции на силы и моменты.
// Создание динамического тела
let body = world.add({
type: "rigid",
pos: [0, 5, 0],
rot: [0, 0, 0],
move: true,
shapes: [
{ type: "box", size: [2, 1, 1], pos: [0, 0, 0] },
{ type: "sphere", size: [0.5], pos: [0, 1, 0] },
{ type: "cylinder", size: [0.3, 1], pos: [-1, 0, 0], rot: [0, 0, Math.PI/2] }
]
});
shapes — массив объектов, описывающих формы.size),
позицию (pos) и вращение (rot).type указывает тип геометрии: "box",
"sphere", "cylinder",
"capsule".Каждая форма автоматически добавляется к телу и учитывается при вычислении столкновений и физической динамики.
Каждая форма имеет локальные координаты относительно центра масс тела. Изменение позиции формы смещает её относительно тела, но не изменяет глобальное положение тела в мире. Это позволяет комбинировать формы, чтобы создавать сложные структуры, например:
Глобальные координаты формы вычисляются автоматически через позицию тела и локальные смещения формы. Внутренний алгоритм Oimo.js поддерживает корректное пересечение форм с другими объектами сцены.
При добавлении нескольких форм к телу важно учитывать
массовое распределение. Oimo.js вычисляет общую массу и
тензор инерции тела исходя из свойств всех форм. Если необходимо, можно
задавать массу каждой формы через параметр density:
shapes: [
{ type: "box", size: [2, 1, 1], pos: [0, 0, 0], density: 2 },
{ type: "sphere", size: [0.5], pos: [0, 1, 0], density: 1 }
]
Это позволяет контролировать центр масс и поведение тела при вращении. Неравномерное распределение массы приведет к наклонному падению, зависящему от момента инерции.
Все формы на одном теле участвуют в коллизиях одновременно. При контакте с другим объектом движок выполняет следующие шаги:
Это позволяет создавать объекты с нестандартными формами, которые взаимодействуют с окружением точно и реалистично. Например, тело с коробкой и цилиндром одновременно может катиться, скользить или опрокидываться, учитывая форму каждого элемента.
Oimo.js поддерживает возможность добавления или удаления форм динамически:
// Добавление новой сферы к существующему телу
body.addShape({ type: "sphere", size: [0.3], pos: [1, 0, 0] });
// Удаление формы по индексу
body.removeShape(0);
Важно помнить, что после изменения состава форм движок пересчитывает массу и тензор инерции, поэтому объекты могут изменить поведение при столкновениях.
box,
sphere, cylinder) вместо сложных мешей.box) и колесами (cylinder).Использование нескольких форм на одном теле открывает возможность создавать реалистичную динамику сложных объектов, не прибегая к дорогостоящим моделям мешей и обеспечивая высокую производительность в браузере.