Создание тела через addRigidBody и RigidBodyConfig

В физическом движке Oimo.js ключевым элементом являются тела (rigid bodies), которые определяют объекты с физическими свойствами и позволяют им взаимодействовать в 3D-пространстве. Основными средствами создания тел служат метод addRigidBody и объект конфигурации RigidBodyConfig.


Объект RigidBodyConfig

RigidBodyConfig представляет собой набор параметров, определяющих физическое поведение тела. Его использование позволяет гибко настраивать массу, положение, ориентацию, тип динамики и другие характеристики. Стандартные поля RigidBodyConfig включают:

  • type – тип тела:

    • "dynamic" – подчиняется всем силам и столкновениям, подвижное тело.
    • "static" – неподвижное тело, используется для пола или стен.
    • "kinematic" – тело управляется вручную, не реагирует на физику напрямую, но взаимодействует с динамическими телами.
  • position – вектор [x, y, z], задающий начальное положение тела.

  • rotation – вектор [x, y, z] или кватернион для ориентации тела.

  • linearVelocity – вектор скорости перемещения [vx, vy, vz].

  • angularVelocity – вектор угловой скорости [ax, ay, az].

  • mass – масса тела, влияет на динамическое поведение при столкновениях.

  • allowSleep – логическое значение, определяющее возможность тела переходить в режим покоя для оптимизации вычислений.

  • friction – коэффициент трения поверхности тела.

  • restitution – коэффициент упругости при столкновениях.

Пример создания конфигурации:

const config = new OIMO.RigidBodyConfig();
config.type = "dynamic";
config.position = [0, 5, 0];
config.mass = 2;
config.friction = 0.5;
config.restitution = 0.3;

Метод addRigidBody

Метод addRigidBody используется для добавления тела в мир физики. Он принимает объект RigidBodyConfig и, опционально, геометрию (shape) тела. Основные шаги:

  1. Создание конфигурации RigidBodyConfig.
  2. Настройка параметров: положение, масса, трение, упругость, тип тела.
  3. Создание формы (shape), которая определяет коллизионную геометрию.
  4. Вызов addRigidBody с переданными конфигурацией и формой.

Пример:

// Конфигурация тела
const bodyConfig = new OIMO.RigidBodyConfig();
bodyConfig.type = "dynamic";
bodyConfig.position = [0, 10, 0];
bodyConfig.mass = 1;

// Создание формы (куб)
const boxShape = new OIMO.BoxGeometry(1, 1, 1);

// Добавление тела в мир
const body = world.addRigidBody(bodyConfig, boxShape);

После вызова addRigidBody тело начинает участвовать в симуляции: на него воздействуют силы гравитации, столкновения с другими телами, трение и упругость.


Типы тел и их особенности

  • Динамическое тело (dynamic) – реагирует на силы и столкновения, используется для объектов, которые должны двигаться и падать. Масса и моменты инерции напрямую влияют на движение.
  • Статическое тело (static) – не изменяет положение под воздействием физики, используется для пола, стен, платформ. Не требует вычислений столкновений в динамике, что ускоряет симуляцию.
  • Кинематическое тело (kinematic) – управляется программно через методы изменения позиции/ротации, может воздействовать на динамические тела при столкновениях. Не подчиняется силам и гравитации.

Управление свойствами тела после создания

После добавления тела в мир можно динамически изменять его параметры:

  • body.setPosition([x, y, z]) – перемещение тела.
  • body.setRotation([x, y, z]) – изменение ориентации.
  • body.applyForce([fx, fy, fz]) – прикладывание силы.
  • body.applyTorque([tx, ty, tz]) – прикладывание момента силы.
  • body.sleep() / body.wakeUp() – управление режимом сна.

Формы тел

Физическое тело состоит не только из конфигурации, но и из формы (shape), которая определяет столкновения:

  • BoxGeometry – куб или прямоугольник.
  • SphereGeometry – сфера.
  • CylinderGeometry – цилиндр.
  • ConeGeometry – конус.
  • CapsuleGeometry – капсула.
  • ConvexHullGeometry – произвольная геометрия, ограниченная выпуклой оболочкой.

Пример создания тела со сферической формой:

const sphereConfig = new OIMO.RigidBodyConfig();
sphereConfig.type = "dynamic";
sphereConfig.position = [2, 15, 0];
sphereConfig.mass = 0.8;

const sphereShape = new OIMO.SphereGeometry(1);

const sphereBody = world.addRigidBody(sphereConfig, sphereShape);

Рекомендации по настройке

  • Масса и коэффициенты трения/упругости должны соответствовать размеру и типу объекта.
  • Статические и кинематические тела лучше использовать для оптимизации производительности.
  • Для сложных объектов можно комбинировать несколько форм, добавляя их через body.addShape(shapeConfig) к одному телу.
  • Следует внимательно управлять положением и ориентацией кватернионов, чтобы избежать «залипания» тела в неправильной позиции.

Интеграция с симуляцией

После создания тел через addRigidBody, они автоматически включаются в симуляцию мира Oimo.js, реагируя на гравитацию, столкновения и внешние силы. Обновление мира выполняется методом world.step(), который вычисляет новые позиции и ориентацию всех тел, а визуализация синхронизируется с этими данными.

function update() {
    world.step();
    // синхронизация визуальных объектов с физикой
    mesh.position.copy(body.getPosition());
    mesh.rotation.copy(body.getRotation());
}

Использование RigidBodyConfig совместно с addRigidBody обеспечивает гибкую и мощную систему управления физикой объектов, позволяя создавать как простые динамические кубы, так и сложные кинематические конструкции с реалистичным поведением.