Oimo.js — это легковесный физический движок для Javascript, обеспечивающий реалистичное моделирование твердых тел в 3D-пространстве. Он работает на основе интеграции Ньютона и вычисляет столкновения, силы, трение и инерцию объектов в реальном времени. Центральными элементами являются тела (RigidBody) и их геометрии (Geometry), которые задают форму и физические свойства объекта. Среди разнообразных геометрий выделяется капсула (CapsuleGeometry), которая сочетает цилиндр и полусферы на концах, идеально подходящая для моделирования персонажей, сферических объектов и объектов с плавными краями.
CapsuleGeometry представляет собой сочетание цилиндра и двух полусфер на концах, формируя удлиненную сферическую форму. В Oimo.js капсула задается с помощью трех основных параметров:
height + 2 * radius.x, y или z), определяющее
ориентацию объекта в пространстве.Пример создания капсулы:
import * as OIMO from "oimo";
const world = new OIMO.World({
timestep: 1/60,
gravity: [0, -9.8, 0],
iterations: 8
});
const capsuleShape = new OIMO.CapsuleGeometry({
radius: 0.5,
height: 2,
axis: "y"
});
const capsuleBody = new OIMO.RigidBody({
type: "dynamic",
position: [0, 5, 0],
shapes: [capsuleShape]
});
world.addRigidBody(capsuleBody);
Капсульное тело, как и любое тело в Oimo.js, обладает позицией,
ориентацией и скоростью. Для управления можно использовать методы
setPosition, setRotation и свойства
linearVelocity, angularVelocity. Например:
// Перемещение капсулы
capsuleBody.setPosition([2, 10, 0]);
// Задание скорости
capsuleBody.linearVelocity = [0, -5, 0];
capsuleBody.angularVelocity = [0, 1, 0];
Ось капсулы (axis) не изменяет физическую ориентацию
автоматически при вращении; необходимо использовать матрицы вращения или
кватернионы для сложных движений.
Oimo.js позволяет задавать маски столкновений и слои, что полезно для игр и симуляций. Например, капсула персонажа может взаимодействовать только с землей и врагами, игнорируя другие капсулы или объекты интерфейса:
capsuleBody.shapes[0].collisionGroup = 1; // группа персонажей
capsuleBody.shapes[0].collisionMask = 2 | 4; // взаимодействует с землей (2) и врагами (4)
CapsuleGeometry обычно не используется напрямую для рендеринга, так как это физическая геометрия. Для визуализации создается отдельный 3D-меш, синхронизируемый с положением и вращением тела:
// Three.js пример
const geometry = new THREE.CapsuleGeometry(0.5, 2, 8, 16);
const material = new THREE.MeshStandardMaterial({ color: 0xff0000 });
const mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);
// В каждом кадре
mesh.position.copy(capsuleBody.getPosition());
mesh.quaternion.copy(capsuleBody.getQuaternion());
CapsuleGeometry для персонажей или
объектов с высоким аспектом (длинные и тонкие), чтобы минимизировать
застревания.radius относительно
height, так как это может вызвать нестабильные
столкновения.CapsuleGeometry в Oimo.js сочетает простоту, стабильность и производительность, делая её незаменимой для физически корректного моделирования человеческих фигур, спортивного инвентаря и игровых объектов с закругленными концами.