Прямоугольный параллелепипед: BoxGeometry

Библиотека 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 определяет масштаб мира.


Создание тела Box

Прямоугольный параллелепипед создаётся через 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;

Это позволяет контролировать, с какими объектами тело может сталкиваться.


Советы по оптимизации

  1. Масштаб мира. Большие размеры объектов при worldscale = 1 могут вести к нестабильности. Обычно рекомендуется worldscale = 10.1.
  2. Количество итераций. Повышение iterations улучшает стабильность контактов, но увеличивает нагрузку на процессор.
  3. Использование статических тел. Для пола, стен и платформ лучше задавать move: false — это снижает вычислительную нагрузку.
  4. Контроль столкновений. Избегать тонких Box с большой плотностью — могут «проходить» сквозь другие объекты.

Применение BoxGeometry в практических задачах

  • Симуляция объектов в сцене. Коробки, платформы, стены и препятствия.
  • Строительные конструкции. Создание башен и зданий с реалистичной гравитацией.
  • Игровые объекты. Динамическое поведение предметов при столкновениях и падениях.
  • Физические головоломки. Реализация падающих, катящихся или скользящих тел.

Каждое тело 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 пространстве.