Библиотека Oimo.js обеспечивает реалистичную физику
для трёхмерных объектов в среде JavaScript. Центральным понятием
является мир физики (OIMO.World), в
котором создаются и управляются физические тела
(OIMO.RigidBody). Каждое тело обладает свойствами массы,
формы, динамики и коллизий. Для создания тел используется система
форм (OIMO.Shape), где наиболее
распространённой является форма Box для прямоугольных
параллелепипедов.
const world = new OIMO.World({
timestep: 1/60,
iterations: 8,
broadphase: 2,
worldscale: 1,
random: true,
info: false
});
Здесь timestep задаёт интервал обновления физического
мира, iterations — количество итераций для решения
столкновений, broadphase управляет алгоритмом обнаружения
столкновений, а worldscale определяет масштаб мира.
Прямоугольный параллелепипед создаётся через RigidBody с формой BoxGeometry. Основные параметры:
size: массив [width, height, depth],
задающий размеры.pos: позиция тела в пространстве
[x, y, z].rot: поворот в радианах
[rotX, rotY, rotZ].move: логический параметр, определяющий динамическое
(true) или статическое (false) тело.density: плотность тела, влияющая на массу.friction: коэффициент трения при контакте.restitution: коэффициент упругости при
столкновениях.Пример создания динамического параллелепипеда:
const box = world.add({
type: "box",
size: [2, 1, 3],
pos: [0, 5, 0],
rot: [0, 0, 0],
move: true,
density: 1,
friction: 0.5,
restitution: 0.2
});
move: true делает объект подверженным силе гравитации и
столкновениям. Статический объект (move: false)
используется для пола или стен.
Плотность и масса. Масса вычисляется автоматически
как произведение плотности на объём тела. Для Box с размерами
[w, h, d] и плотностью ρ:
[ = w h d ρ]
Трение и упругость. friction определяет
сопротивление скольжению при контакте с другими телами, а
restitution управляет «отскоком». Значения обычно в
диапазоне 0–1.
Повороты и ориентация. Параметр rot
задаётся в радианах. Можно использовать методы
setQuaternion для точного контроля вращения.
box.setQuaternion(new OIMO.Quat().setEuler(Math.PI/4, 0, 0));
Для корректной работы физики требуется регулярно обновлять мир:
function animate() {
world.step();
requestAnimationFrame(animate);
}
animate();
Метод world.step() пересчитывает положение всех тел,
учитывает силы, столкновения и гравитацию. Для визуализации движений Box
необходимо синхронизировать координаты тела с объектом на сцене
(например, в Three.js):
mesh.position.copy(box.getPosition());
mesh.quaternion.copy(box.getQuaternion());
Box взаимодействует с другими телами через коллайдеры. Oimo.js автоматически рассчитывает:
Для детальной настройки можно использовать collision masks:
box.shapes[0].collisionGroup = 1;
box.shapes[0].collisionMask = 0xffffffff;
Это позволяет контролировать, с какими объектами тело может сталкиваться.
worldscale = 1 могут вести к нестабильности. Обычно
рекомендуется worldscale = 1–0.1.iterations улучшает стабильность контактов, но увеличивает
нагрузку на процессор.move: false — это снижает
вычислительную нагрузку.Каждое тело Box может быть комбинировано с другими формами (Sphere,
Cylinder) для создания сложных объектов, а также с системами ограничений
(OIMO.Joint) для реализации подвижных механизмов.
box.applyForce([x, y, z]) — приложить силу к телу.box.applyImpulse([x, y, z]) — мгновенный импульс.box.setLinearVelocity([x, y, z]) — задать скорость
перемещения.box.setAngularVelocity([x, y, z]) — задать скорость
вращения.box.sleep() и box.wakeUp() — управление
активностью тела для оптимизации.Использование этих методов позволяет точно моделировать физические взаимодействия и добиваться реалистичного поведения прямоугольных параллелепипедов в 3D пространстве.