Локальное и мировое пространство

В контексте разработки 3D-графики в PlayCanvas важную роль играют понятия локальной и мировой системы координат. Эти пространства служат для определения позиции объектов, их ориентации и масштаба в виртуальном мире. Понимание различий между локальными и мировыми координатами критически важно для работы с движением, анимацией и взаимодействием объектов в 3D-сцене.

Локальное пространство

Локальное пространство (или локальные координаты) объекта в PlayCanvas — это система координат, которая определяется относительно родительского объекта. Каждое положение, ориентация и масштаб объекта в локальной системе координат являются относительными к его родителю.

Пример: Если у вас есть объект A, который является родительским для объекта B, то координаты объекта B в локальной системе будут измеряться относительно объекта A. Если объект A перемещается, поворачивается или масштабируется, то все дочерние объекты также будут изменять свои локальные координаты, сохраняя относительное положение.

В PlayCanvas локальные координаты можно задать через свойства объекта localPosition, localRotation и localScale. Эти свойства предоставляют информацию о положении, ориентации и масштабе объекта относительно его родительского объекта.

Пример кода:

var entity = new pc.Entity();
entity.setLocalPosition(10, 5, 0);
entity.setLocalRotation(0, 45, 0);
entity.setLocalScale(2, 2, 2);

Здесь setLocalPosition устанавливает локальное положение объекта, setLocalRotation — локальный угол поворота, а setLocalScale — локальный масштаб относительно родителя.

Мировое пространство

Мировое пространство (или мировые координаты) — это система координат, которая фиксирована относительно всей сцены. В отличие от локальных координат, мировые координаты всегда учитывают все трансформации (перемещения, повороты, масштабирование) всех родительских объектов.

Мировые координаты позволяют определить точное положение объекта в глобальной системе координат сцены, независимо от его родительской иерархии. В PlayCanvas мировые координаты объекта можно получить через свойства getPosition, getRotation и getScale. Эти методы возвращают данные о положении, ориентации и масштабе объекта относительно мировой системы координат.

Пример кода:

var worldPosition = entity.getPosition(); // Мировое положение
var worldRotation = entity.getRotation(); // Мировой поворот
var worldScale = entity.getScale(); // Мировой масштаб

Перевод между локальным и мировым пространством

Иногда возникает необходимость перевести координаты из одного пространства в другое. Для этого PlayCanvas предоставляет удобные методы для преобразования между локальными и мировыми координатами.

Перевод из локальных координат в мировые

Для перевода локальных координат в мировые можно использовать метод localToWorld. Этот метод принимает локальные координаты точки и возвращает её мировые координаты.

Пример:

var localPoint = new pc.Vec3(1, 1, 0);
var worldPoint = entity.localToWorld(localPoint);

В этом примере точка с координатами (1, 1, 0) в локальной системе объекта entity преобразуется в мировые координаты.

Перевод из мировых координат в локальные

Если нужно преобразовать мировые координаты в локальные, используется метод worldToLocal. Этот метод принимает мировые координаты и возвращает локальные координаты относительно объекта.

Пример:

var worldPoint = new pc.Vec3(10, 5, 0);
var localPoint = entity.worldToLocal(worldPoint);

В этом примере точка с мировыми координатами (10, 5, 0) преобразуется в локальные координаты относительно объекта entity.

Применение локальных и мировых координат

Понимание локального и мирового пространства имеет множество практических применений в разработке 3D-приложений. Наиболее распространённые случаи включают:

  1. Движение объектов в сцене: Когда объект перемещается в сцене, важно учитывать его положение относительно других объектов, особенно если они находятся в иерархической структуре (родитель/дочь). Локальные координаты позволяют отслеживать, как объект двигается относительно своей иерархии, а мировые — в контексте всей сцены.

  2. Интерактивность: При взаимодействии с объектами, например, при клике или касании, необходимо учитывать их мировые координаты, чтобы точно определить, какой объект был выбран. В PlayCanvas для этого часто используются методы преобразования мировых координат в локальные координаты экрана.

  3. Кинематические трансформации: В анимации или при движении персонажа важно управлять движением объектов в мировых координатах, но при этом учитывать их локальные координаты для правильного синхронизированного движения в иерархии сцены.

Практические примеры

Перемещение объектов по сцене

Допустим, нужно переместить объект в мировых координатах. Для этого можно использовать setPosition с мировыми координатами:

entity.setPosition(10, 5, 0); // Перемещает объект в мировые координаты (10, 5, 0)

Однако если нужно переместить объект в локальные координаты его родителя, следует использовать:

entity.setLocalPosition(2, 3, 0); // Перемещает объект относительно родителя

Поворот объекта в мировых координатах

Для поворота объекта относительно мировой системы координат можно использовать метод setRotation:

entity.setRotation(45, 0, 0); // Поворот объекта на 45 градусов вокруг оси X

Если же нужно изменить поворот относительно родительской системы координат, используется setLocalRotation:

entity.setLocalRotation(30, 0, 0); // Поворот объекта относительно родителя на 30 градусов

Заключение

В PlayCanvas работа с локальным и мировым пространствами позволяет разработчику эффективно управлять позициями, ориентациями и масштабами объектов в 3D-сценах. Понимание принципов перевода между локальными и мировыми координатами помогает решать сложные задачи, такие как анимации, взаимодействия с объектами и динамическое управление сценой. Эти знания лежат в основе построения гибких и интерактивных приложений на базе PlayCanvas.