Oimo.js — это лёгкая физическая библиотека на JavaScript, предназначенная для симуляции твёрдого тела, столкновений и динамики объектов в 3D-пространстве. Она работает на принципах rigid body dynamics и широко применяется вместе с движком Babylon.js для создания интерактивных сцен с физикой.
В Babylon.js физический движок реализуется через плагинную архитектуру, где Oimo.js выступает одним из возможных физических движков. Основная идея плагина — это создание прослойки между сценой Babylon.js и физическим движком, обеспечивающей синхронизацию объектов и обработку коллизий.
Для начала необходимо подключить Oimo.js к сцене Babylon.js через плагин:
const physicsPlugin = new BABYLON.OimoJSPlugin();
scene.enablePhysics(new BABYLON.Vector3(0, -9.81, 0), physicsPlugin);
Ключевые моменты:
OimoJSPlugin реализует интерфейс
IPhysicsEnginePlugin, требуемый Babylon.js.enablePhysics активирует физический движок для
всей сцены и задаёт глобальное ускорение (gravity).Физические тела в Oimo.js представляют объекты с массой, формой и
динамическими свойствами. В Babylon.js для привязки физики к мешам
используются методы physicsImpostor.
Пример создания куба с физикой:
const box = BABYLON.MeshBuilder.CreateBox("box", {size: 2}, scene);
box.position.y = 5;
box.physicsImpostor = new BABYLON.PhysicsImpostor(
box,
BABYLON.PhysicsImpostor.BoxImpostor,
{ mass: 1, restitution: 0.7, friction: 0.5 },
scene
);
Объяснение параметров:
PhysicsImpostor.BoxImpostor — тип формы для
Oimo.js.mass — масса объекта, влияет на динамику и
инерцию.restitution — коэффициент упругости при
столкновениях.friction — коэффициент трения при скольжении.Oimo.js поддерживает три типа тел:
Static body (статическое тело) Не реагирует на силы и столкновения, используется для пола, стен и платформ.
const ground = BABYLON.MeshBuilder.CreateGround("ground", {width: 20, height: 20}, scene);
ground.physicsImpostor = new BABYLON.PhysicsImpostor(
ground,
BABYLON.PhysicsImpostor.BoxImpostor,
{ mass: 0 },
scene
);Dynamic body (динамическое тело) Реагирует на силы, гравитацию и столкновения. Примеры: кубы, шары, игроки.
Kinematic body (кинематическое тело) Движется под управлением скрипта, но взаимодействует с динамическими телами. Масса не влияет на движение, но влияет на столкновения.
Oimo.js реализует базовые коллайдеры:
Каждая форма передаётся через PhysicsImpostor в
Babylon.js. Для точной симуляции можно комбинировать несколько тел с
разными формами.
Физические свойства задаются через объект
PhysicsImpostor:
mass — масса тела.friction — трение.restitution — упругость.linearDamping — затухание линейного движения (замедляет
скорость).angularDamping — затухание вращения (смягчает вращения
тела).Пример динамической настройки свойств:
box.physicsImpostor.setMass(5);
box.physicsImpostor.physicsBody.linearDamping = 0.1;
Oimo.js поддерживает различные типы связей:
Пример шарнирного соединения:
const hinge = new BABYLON.HingeJoint({
mainPivot: new BABYLON.Vector3(0, 1, 0),
connectedPivot: new BABYLON.Vector3(0, -1, 0),
mainAxis: new BABYLON.Vector3(0, 0, 1),
connectedAxis: new BABYLON.Vector3(0, 0, 1)
});
box.physicsImpostor.addJoint(anotherBox.physicsImpostor, hinge);
Oimo.js обновляет физику через шаги симуляции. Babylon.js
автоматически синхронизирует позиции и вращения мешей через
PhysicsImpostor. Частота обновлений задаётся через
scene.registerBeforeRender.
Пример:
scene.registerBeforeRender(() => {
// Дополнительные действия с телами перед рендером
});
Особенность: Oimo.js использует фиксированный шаг интеграции, поэтому крупные кадры с пропущенными шагами могут вызвать нестабильность. Рекомендуется фиксировать шаг симуляции на уровне 1/60 секунд.
linearDamping и angularDamping
для предотвращения дрожания объектов.Создать несколько блоков с динамическими телами и статическую платформу. При столкновении блоки будут падать и рассыпаться.
Использовать статический блок в качестве точки крепления и динамическое тело, соединённое шарниром. Реалистично симулируется движение маятника.
Использовать Oimo.js для обработки всех движущихся объектов сцены, включая персонажей, предметы и физические эффекты. С помощью Babylon.js визуализировать взаимодействия.
Oimo.js позволяет добавлять силы и импульсы динамическим телам:
box.physicsImpostor.applyImpulse(
new BABYLON.Vector3(0, 10, 0),
box.getAbsolutePosition()
);
applyImpulse — мгновенное воздействие силы.applyForce — постоянное воздействие, применяется каждый
кадр.Это позволяет создавать эффекты толчков, выстрелов или ветра.
Oimo.js можно комбинировать с:
Такое сочетание обеспечивает богатую интерактивную физическую сцену без потери производительности.
Если требуется, могу подготовить детальный пример полной сцены с Oimo.js и Babylon.js, показывающей динамику, соединения и пользовательские силы. Это будет практически полноценный учебный кейс.