Получение и установка трансформации тела

В 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, обеспечивая точное управление положением и ориентацией физических объектов в симуляции.