Oimo.js использует правостороннюю декартову систему координат, где ось X направлена вправо, ось Y — вверх, а ось Z — на пользователя (в сторону экрана). Важно понимать, что физический мир в Oimo.js моделируется в метрах, а не в пикселях или других единицах. Это обеспечивает стабильность симуляции и корректное поведение физических объектов при взаимодействиях.
Положение (position): вектор, определяющий
координаты объекта в пространстве. Представляется через объект
OIMO.Vec3 с тремя компонентами: x,
y и z.
let position = new OIMO.Vec3(0, 5, 0);Размеры (size): объекты задаются в метрах. Например, куб размером 1x1x1 будет восприниматься как куб со стороной в один метр.
Единицы силы и массы: масса измеряется в килограммах, силы — в ньютонах, ускорение — в м/с². Это согласуется с реальными физическими законами.
Oimo.js оперирует положением объектов через
rigidBody.setPosition() и
rigidBody.getPosition(). Внутри симуляции координаты
объектов изменяются автоматически на каждом шаге интеграции.
let body = world.add({
type: 'box',
size: [1, 1, 1],
pos: [0, 10, 0],
move: true,
density: 1
});
body.getPosition(); // вернёт объект OIMO.Vec3 с текущей позицией
setPosition() могут конфликтовать с
физическим интегратором. Для естественного движения предпочтительнее
использовать силы (applyForce) или скорость
(setLinearVelocity).Oimo.js предоставляет набор встроенных операций с векторами:
Vec3.add(v1, v2): сложение векторов.Vec3.sub(v1, v2): вычитание.Vec3.scale(v, scalar): умножение на скаляр.Vec3.dot(v1, v2): скалярное произведение.Vec3.cross(v1, v2): векторное произведение.Пример расчёта смещения:
let pos = body.getPosition();
let offset = new OIMO.Vec3(2, 0, 0);
let newPos = OIMO.Vec3.add(pos, offset);
Для интеграции с Three.js или Babylon.js, где единицы часто задаются в условных координатах, необходимо согласовывать масштаб:
const SCALE = 100; // 1 метр = 100 единиц
mesh.position.set(
body.getPosition().x * SCALE,
body.getPosition().y * SCALE,
body.getPosition().z * SCALE
);
Oimo.js использует кватернионы для задания ориентации
(Quaternion) и позволяет работать с локальными осями
объекта. Ключевые моменты:
let q = body.getQuaternion();
let forward = new OIMO.Vec3(0, 0, 1); // локальная ось Z
let globalForward = q.toMatrix().multiplyVec3(forward);
world.step(timeStep))
обеспечивает синхронность между физикой и рендером.Соблюдение этих правил позволяет создавать стабильные и предсказуемые симуляции с точной привязкой к графическим объектам.