Связь Shape с RigidBody через addShape

В 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

Метод 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 автоматически пересчитывается с учетом всех добавленных форм и их плотности.


Влияние параметров Shape на RigidBody

  1. Масса и центр тяжести: каждый Shape с плотностью добавляет массу и смещает центр тяжести. Сложные комбинации форм могут существенно изменять поведение тела.
  2. Сила трения и упругость: свойства friction и restitution каждого Shape учитываются при столкновениях. Если у тела несколько форм с разными трениями, Oimo.js использует усредненные значения для расчета контакта.
  3. Смещение и вращение: Shape может быть смещен относительно RigidBody (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 пересчитывает массу и центр тяжести автоматически.


Практические советы

  • Несколько форм для сложных объектов: комбинирование Box, Sphere и Capsule дает точное приближение сложных коллизий без использования дорогих Mesh Collider.
  • Центр тяжести: смещая pos отдельных форм, можно управлять балансом и устойчивостью объектов.
  • Динамическое изменение свойств: изменение плотности, трения или упругости Shapes на лету позволяет реализовать эффекты разрушения, скольжения и изменения поведения.
  • Производительность: добавление слишком большого количества мелких Shape может замедлить симуляцию. Оптимально использовать минимальное количество форм, обеспечивающее точную коллизию.

Связь Shape и RigidBody через addShape является фундаментальным механизмом Oimo.js для построения сложных физических объектов. Правильное использование смещений, ориентаций и комбинаций форм позволяет создавать динамичные, реалистичные симуляции с точным поведением при столкновениях.