В Oimo.js каждая физическая сущность представлена объектом RigidBody, который инкапсулирует свойства массы, формы, скорости и трансформации. Трансформация тела включает позицию, ориентацию (кватернион или матрицу поворота) и масштаб (редко используется, чаще задаётся при создании формы).
Позиция тела хранится в свойстве position объекта
RigidBody. Оно представляет собой вектор в трёхмерном
пространстве с координатами (x, y, z):
let pos = body.getPosition(); // Возвращает OIMO.Vec3
console.log(`X: ${pos.x}, Y: ${pos.y}, Z: ${pos.z}`);
Особенности:
world.step().body.position не
рекомендуется, лучше использовать getPosition(), чтобы
гарантировать актуальность данных.Ориентация задаётся кватернионом, который хранится в свойстве
rotation объекта RigidBody. Для работы с
поворотами доступны следующие методы:
let quat = body.getQuaternion(); // Возвращает OIMO.Quat
console.log(`x: ${quat.x}, y: ${quat.y}, z: ${quat.z}, w: ${quat.w}`);
Преобразование в матрицу:
Иногда удобнее работать с матрицей поворота, особенно для интеграции с графикой:
let mat = body.getMatrix(); // Возвращает 4x4 матрицу для WebGL или Three.js
Матрица объединяет позицию и ориентацию тела, что упрощает визуализацию объектов.
Полная трансформация тела включает как позицию, так и ориентацию. В Oimo.js для этого используют объект Transform:
let transform = body.getTransform();
let pos = transform.position;
let quat = transform.rotation;
transform.position — вектор позиции.transform.rotation — кватернион ориентации.Transform актуально при сложных
взаимодействиях с графическим движком.Установка позиции и ориентации тела производится через методы:
// Установка позиции
body.setPosition(new OIMO.Vec3(5, 10, 0));
// Установка ориентации через кватернион
body.setQuaternion(new OIMO.Quat(0, 0, 0, 1));
Можно комбинировать оба действия:
body.setTransform(new OIMO.Vec3(5, 10, 0), new OIMO.Quat(0, 0, 0, 1));
Замечания:
body.linearVelocity = new OIMO.Vec3(0, 0, 0);
body.angularVelocity = new OIMO.Vec3(0, 0, 0);
Часто требуется синхронизировать физические тела с визуальными объектами, например, в Three.js:
mesh.position.copy(body.getPosition());
mesh.quaternion.copy(body.getQuaternion());
getPosition() и getQuaternion() возвращают
актуальные значения после каждого шага симуляции.Vec3 и
Quat, чтобы избежать лишнего создания новых
экземпляров.Oimo.js поддерживает иерархии через Compound Shapes. В этом случае:
Получение глобальной трансформации производится через
body.getTransform(), локальной — через соответствующие
методы компонентов, если используется составная форма.
После каждого шага симуляции (world.step()) значения
трансформации обновляются автоматически. Для точного получения состояния
тела следует:
world.step(timeStep);
let pos = body.getPosition();
let quat = body.getQuaternion();
timeStep задаёт интервал симуляции.world.step() возвращает
состояние тела на предыдущий кадр.getPosition() и
getQuaternion() используются постоянно для визуализации и
логики игры.| Метод | Назначение |
|---|---|
getPosition() |
Получение позиции тела (OIMO.Vec3) |
getQuaternion() |
Получение ориентации тела (OIMO.Quat) |
getTransform() |
Получение полной трансформации (Transform) |
setPosition(v) |
Установка позиции |
setQuaternion(q) |
Установка ориентации |
setTransform(pos, quat) |
Установка позиции и ориентации одновременно |
Эти методы образуют ядро работы с трансформацией тел в Oimo.js, обеспечивая точное управление положением и ориентацией физических объектов в симуляции.