В физическом движке Oimo.js ключевым элементом
являются тела (rigid bodies), которые определяют объекты с физическими
свойствами и позволяют им взаимодействовать в 3D-пространстве. Основными
средствами создания тел служат метод addRigidBody и объект
конфигурации RigidBodyConfig.
RigidBodyConfigRigidBodyConfig представляет собой набор параметров,
определяющих физическое поведение тела. Его использование позволяет
гибко настраивать массу, положение, ориентацию, тип динамики и другие
характеристики. Стандартные поля 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) тела. Основные шаги:
RigidBodyConfig.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), которая определяет столкновения:
Пример создания тела со сферической формой:
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 обеспечивает гибкую и мощную систему
управления физикой объектов, позволяя создавать как простые динамические
кубы, так и сложные кинематические конструкции с реалистичным
поведением.