В физическом движке Oimo.js каждое физическое тело
(RigidBody) может содержать одну или несколько
геометрических форм (Shape). Тело с несколькими формами
называется составным (compound body). Такая конструкция
позволяет описывать сложную геометрию без необходимости создавать
множество отдельных тел и соединять их ограничениями.
Составное тело — это один динамический объект с:
Формы могут иметь собственные локальные смещения и ориентацию относительно центра тела.
Внутри движка структура выглядит следующим образом:
World — физический мир.RigidBody — физическое тело.Shape — геометрическая форма (Box, Sphere, Cylinder и
др.).ShapeConfig — конфигурация формы.Каждая форма содержит:
При создании нескольких форм для одного тела движок автоматически:
Oimo.js использует примитивы (box, sphere, cylinder) для коллизий. Неправильные многогранники или модели произвольной формы напрямую не поддерживаются. Составное тело решает проблему: сложная фигура аппроксимируется набором простых форм.
Пример: автомобиль можно представить как:
Соединение нескольких тел через Joint увеличивает
нагрузку на солвер ограничений. Составное тело:
Один RigidBody с несколькими формами:
Пример создания тела с двумя формами:
var world = new OIMO.World();
var bodyConfig = new OIMO.RigidBodyConfig();
bodyConfig.type = OIMO.RigidBodyType.DYNAMIC;
bodyConfig.position.init(0, 5, 0);
var body = new OIMO.RigidBody(bodyConfig);
world.addRigidBody(body);
// Первая форма — основной блок
var shapeConfig1 = new OIMO.ShapeConfig();
shapeConfig1.geometry = new OIMO.BoxGeometry(new OIMO.Vec3(1, 1, 1));
var shape1 = new OIMO.Shape(shapeConfig1);
body.addShape(shape1);
// Вторая форма — смещённый блок
var shapeConfig2 = new OIMO.ShapeConfig();
shapeConfig2.geometry = new OIMO.BoxGeometry(new OIMO.Vec3(0.5, 0.5, 0.5));
shapeConfig2.position.init(1.5, 0, 0);
var shape2 = new OIMO.Shape(shapeConfig2);
body.addShape(shape2);
// Обновление масс-инерционных характеристик
body.setupMass(OIMO.RigidBodyType.DYNAMIC);
Ключевой момент: после добавления всех форм необходимо
вызвать setupMass, иначе центр масс и инерция не
будут корректно пересчитаны.
Каждая форма располагается в локальной системе координат тела:
shapeConfig.position — смещение относительно центра
тела.shapeConfig.rotation — локальная ориентация.Это позволяет создавать асимметричные конструкции.
Если формы расположены несимметрично, центр масс будет смещён. Движок автоматически вычисляет новый центр и пересчитывает:
Это влияет на поведение тела при вращении. Например:
При использовании setupMass Oimo.js:
Масса формы зависит от:
density),Если плотность не указана, используется значение по умолчанию.
Пример задания плотности:
shapeConfig1.density = 2;
shapeConfig2.density = 1;
Это позволяет контролировать распределение веса внутри составного тела.
Каждая форма участвует в широкой (broadphase) и узкой (narrowphase) фазе коллизий.
Особенности:
RigidBody.Если одна из форм касается поверхности, сила реакции воздействует на всё тело с учётом плеча приложения силы, что создаёт корректный вращательный момент.
Добавление формы после начала симуляции требует пересчёта массы. Если это сделать неправильно, возможны:
Рекомендуется:
Слишком сложная аппроксимация приводит к:
Оптимально использовать 3–10 форм для одного объекта в реальных задачах.
Графическая модель (например, в Three.js) может иметь центр в другом месте. Если не учитывать это, визуальная сцена будет выглядеть некорректно.
Решение:
Если требуется жёсткое соединение нескольких элементов без относительного движения, есть два варианта:
FixedJointСоставное тело предпочтительнее, если:
Использование Joint оправдано при:
Лучше использовать:
Физическая модель не обязана точно повторять визуальную. Допускается грубая аппроксимация, если это не влияет на геймплей.
Если объект не движется, тип STATIC:
Асимметричное распределение форм напрямую влияет на:
При резком приложении импульса:
Корректное проектирование составного тела позволяет добиться реалистичного поведения без сложных математических расчётов вручную.
В движках вроде Cannon.js и Ammo.js используется аналогичный принцип compound shapes. Однако в Oimo.js структура более минималистична и ориентирована на простоту API.
Преимущества реализации в Oimo.js:
Составные тела являются ключевым инструментом моделирования сложных
объектов в Oimo.js. Правильное использование множества форм внутри
одного RigidBody обеспечивает баланс между реализмом,
производительностью и архитектурной чистотой физической системы.