Класс Transform в Oimo.js представляет собой фундаментальный инструмент для управления положением и ориентацией объектов в 3D-пространстве. Он объединяет в себе позицию и ориентацию, позволяя работать с телами, связанными с физическим движком, единым образом. В отличие от отдельных векторов позиции и матриц поворота, Transform хранит их совместно, что упрощает преобразования и интеграцию с физикой.
Объект Transform включает два ключевых свойства:
position — экземпляр класса Vec3,
задающий координаты объекта в мировом пространстве:
transform.position.x
transform.position.y
transform.position.z
Значения задаются в единицах сцены и обычно используются для установки начального положения или получения текущего.
rotation — экземпляр класса Quat
(кватернион), представляющий ориентацию объекта:
transform.rotation.x
transform.rotation.y
transform.rotation.z
transform.rotation.w
Кватернионы обеспечивают стабильное и эффективное представление вращений без эффекта гимбал-лок.
Дополнительно Transform может содержать scale, если требуется поддержка масштабирования, но в стандартной физике Oimo.js масштабирование обычно учитывается на уровне коллайдеров.
Создание нового Transform осуществляется через конструктор с возможностью передачи позиции и ориентации:
const transform = new OIMO.Transform(
new OIMO.Vec3(0, 5, 0),
new OIMO.Quat(0, 0, 0, 1)
);
(0, 0, 0, 1), который соответствует отсутствию
вращения.(0, 0, 0).Класс Transform предоставляет методы для управления положением и ориентацией объектов:
transform.position.set(2, 3, 5);
transform.rotation.copy(new OIMO.Quat().setFromEuler(0, Math.PI / 2, 0));
transform.position.add(new OIMO.Vec3(1, 0, 0));
transform.rotation.mul(new OIMO.Quat().setFromEuler(0, Math.PI/4, 0));
Transform позволяет эффективно комбинировать несколько преобразований:
Мировое и локальное преобразование
const localMove = new OIMO.Vec3(0, 0, 1);
localMove.applyQuat(transform.rotation);
transform.position.add(localMove);Комбинирование Transform
const combined = new OIMO.Transform();
combined.position.copy(transform1.position).add(transform2.position);
combined.rotation.copy(transform1.rotation).mul(transform2.rotation);Преобразование точки
const point = new OIMO.Vec3(1, 0, 0);
point.applyTransform(transform);Transform тесно связан с объектами физического мира:
body.getTransform().position.set(0, 10, 0);
body.getTransform().rotation.setFromEuler(0, Math.PI/2, 0);
body.setPosition() и body.setRotation(), чтобы
сохранить согласованность между Transform и внутренними данными
физики.Использование кватернионов в Transform позволяет:
OIMO.Quat.slerp(transform1.rotation, transform2.rotation, 0.5, transform.rotation);
Класс Transform в Oimo.js обеспечивает единый интерфейс для управления положением и ориентацией объектов. Правильное использование кватернионов и методов трансформации позволяет создавать точные и стабильные физические симуляции, избегая проблем с нестабильными вращениями и неконсистентными позициями.
Он становится ключевым элементом при работе с RigidBody, коллайдерами и динамическими сценами, предоставляя полный контроль над положением и ориентацией в пространстве.