Oimo.js — это легковесный физический движок для JavaScript, ориентированный на работу с трехмерными объектами и их столкновениями. Он реализует динамическую симуляцию твердых тел, позволяя управлять телами, их коллайдерами и силами, а также реализовывать сложные взаимодействия в 3D-пространстве. Движок использует упрощенную физику, что делает его подходящим для игр и интерактивных приложений, где производительность критична.
Основными сущностями являются World, Body, Shape и Joint.
Создание мира начинается с инициализации объекта
OIMO.World. Его параметры включают гравитацию и точность
симуляции:
const world = new OIMO.World({
timestep: 1/60,
gravity: [0, -9.8, 0],
broadphase: 2, // 1: brute force, 2: sweep & prune
});
Добавление тел осуществляется через конструктор
OIMO.Body. Ключевые параметры: type
(dynamic, static, kinematic),
position, size, mass,
friction, restitution.
const box = world.add({
type: 'dynamic',
size: [1, 1, 1],
pos: [0, 5, 0],
move: true,
density: 1,
});
Форма (Shape) определяет, как тело взаимодействует с
другими объектами. В Oimo.js поддерживаются box,
sphere, cylinder,
capsule и convex hull.
const sphere = world.add({
type: 'dynamic',
size: [1, 1, 1],
pos: [2, 10, 0],
shape: 'sphere',
});
Физические свойства формы, такие как friction (трение) и restitution (упругость), позволяют контролировать взаимодействие тел при столкновениях.
Для точного взаимодействия с объектами часто используется
Raycast — проверка пересечения луча с телами мира. В
Oimo.js создается объект OIMO.Ray с начальной точкой и
направлением:
const ray = new OIMO.Ray();
ray.from = [0, 10, 0];
ray.to = [0, 0, 0];
Метод ray.cast(world) возвращает объект столкновения с
информацией о теле, точке пересечения и нормали поверхности:
const hit = ray.cast(world);
if(hit) {
console.log('Hit body:', hit.body);
console.log('Hit position:', hit.position);
}
Raycasting применяется для прицеливания, выбора объектов курсором и реализации механики взаимодействия с миром.
Для определения типа и свойств поверхности после столкновения используется информация о форме и материалах тела. Например, можно получить тип коллайдера и коэффициенты трения:
const shape = hit.body.shapes[0];
console.log('Friction:', shape.friction);
console.log('Restitution:', shape.restitution);
console.log('Shape type:', shape.type);
Эти данные позволяют реализовать:
После получения тела через Raycast его можно перемещать или применять силы:
hit.body.applyImpulse([0, 10, 0], hit.position);
hit.body.setPosition([5, 2, 0]);
Эти инструменты позволяют создавать реалистичные механики: подъем, бросок, толкание и перенос объектов по сцене.
Для динамических тел важны методы:
applyForce(force, position) — постоянная сила в
точке.applyTorque(torque) — момент силы для вращения.setLinearVelocity(velocity) — мгновенная установка
скорости.setAngularVelocity(velocity) — установка угловой
скорости.Применение этих методов совместно с детектированием поверхностей позволяет создавать интерактивные и отзывчивые системы управления объектами.
Oimo.js рассчитан на высокую производительность, но при большом количестве тел важно:
Использование sleeping — перевод объектов в спящий режим при отсутствии движения — значительно снижает нагрузку на симуляцию.
Совмещение Raycasting, работы с телами и формами, а также контроль физических параметров позволяет создавать интерактивные сцены с реалистичной физикой, поддержкой прицеливания и динамическими взаимодействиями с объектами.