В Oimo.js физический объект (RigidBody) и его геометрическая оболочка
(Shape) формируют базовую структуру для симуляции физики.
Shape отвечает за определение формы объекта, его
габаритов, массы, коэффициентов трения и упругости, а
RigidBody обеспечивает динамику: движение, вращение,
столкновения и влияние сил. Метод addShape является
ключевым механизмом для связывания этих двух сущностей.
RigidBody — объект, который участвует в физическом мире. Он может быть статическим, динамическим или кинематическим. Статические тела не подвержены действию сил, динамические — реагируют на все силы и столкновения, кинематические управляются напрямую через позиции и не реагируют на физику напрямую.
Shape — геометрическая форма, определяющая коллизию. Oimo.js поддерживает несколько типов форм:
Box — прямоугольный параллелепипед.Sphere — сфера.Capsule — цилиндр с полусферами на концах.Cylinder — чисто цилиндрическая форма.ConvexMesh — сложная выпуклая форма.Каждый Shape содержит параметры:
size — размеры вдоль осей (для Box), радиус и высота
(для Capsule и Cylinder), радиус (для Sphere).pos — смещение относительно центра RigidBody.rot — ориентация в виде кватерниона.density — плотность материала для вычисления
массы.friction — коэффициент трения при контактах.restitution — коэффициент упругости при
столкновениях.Метод addShape применяется для добавления одной
или нескольких форм к RigidBody. Синтаксис:
rigidBody.addShape(shape);
где shape — объект класса OIMO.Shape.
Пример добавления Box к RigidBody:
const boxShape = new OIMO.Box({ size: [1, 1, 1], pos: [0, 0.5, 0], density: 1 });
const rigidBody = new OIMO.RigidBody({ type: 'dynamic', pos: [0, 5, 0] });
rigidBody.addShape(boxShape);
В этом примере создается динамический RigidBody, который получает форму куба с центром смещенным на 0.5 по оси Y относительно тела.
Ключевой момент: addShape позволяет
комбинировать несколько форм в одном RigidBody. Это
особенно полезно для сложных объектов, когда один Shape не может точно
описать коллизию. Например:
const bottom = new OIMO.Box({ size: [2, 0.5, 2], pos: [0, -0.25, 0] });
const top = new OIMO.Sphere({ size: [0.5], pos: [0, 1, 0] });
rigidBody.addShape(bottom);
rigidBody.addShape(top);
Теперь одно тело имеет две коллизионные формы — куб внизу и сферу сверху. Масса RigidBody автоматически пересчитывается с учетом всех добавленных форм и их плотности.
friction и restitution каждого Shape
учитываются при столкновениях. Если у тела несколько форм с разными
трениями, Oimo.js использует усредненные значения для расчета
контакта.pos) и иметь собственное вращение
(rot). Это позволяет создавать асимметричные объекты или
наклонные поверхности без создания отдельного тела.После вызова addShape Shape становится частью RigidBody,
но его свойства остаются доступны:
const firstShape = rigidBody.shapes[0];
firstShape.friction = 0.8;
firstShape.restitution = 0.2;
Массив rigidBody.shapes содержит все формы, добавленные
к телу. Это позволяет динамически изменять физические параметры даже
после создания объекта.
Удаление формы производится через removeShape:
rigidBody.removeShape(firstShape);
После удаления RigidBody пересчитывает массу и центр тяжести автоматически.
pos отдельных
форм, можно управлять балансом и устойчивостью объектов.Связь Shape и RigidBody через addShape является
фундаментальным механизмом Oimo.js для построения сложных физических
объектов. Правильное использование смещений, ориентаций и комбинаций
форм позволяет создавать динамичные, реалистичные симуляции с точным
поведением при столкновениях.