Работа с пространствами: world, local, screen

В PlayCanvas для представления объектов в 3D-пространстве используется несколько разных типов координатных систем, каждая из которых играет ключевую роль при манипуляциях с объектами сцены. Все объекты, такие как модели, камеры, источники света и другие элементы, могут быть размещены и отображены в различных системах координат. Три важнейшие системы — это мировая (world), локальная (local) и экранная (screen) координатные системы.

Мировая система координат (World Coordinates)

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

Позиция в мировой системе координат — это вектор, который указывает на точку, где находится объект относительно начала мирового координатного пространства (точки (0, 0, 0)).

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

var entity = new pc.Entity();
entity.setPosition(10, 5, 0);  // Устанавливаем позицию в мировой системе координат

В этом примере объект будет размещен на координатах (10, 5, 0) в мировом пространстве, независимо от того, где находится родительский объект или сцена в целом.

Локальная система координат (Local Coordinates)

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

В локальной системе координат объект всегда находится в определенной связи с родителем, что означает, что его позиция и ориентация задаются относительно родительского объекта, а не глобального мира.

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

var parent = new pc.Entity();
var child = new pc.Entity();
parent.addChild(child);
child.setLocalPosition(2, 1, 0);  // Устанавливаем позицию относительно родителя

В данном примере дочерний объект будет перемещен на (2, 1, 0) относительно родительского объекта. Важно понимать, что если родитель изменит свою позицию, дочерний объект автоматически будет двигаться вместе с ним, но всегда сохраняет локальное положение относительно родителя.

Экранная система координат (Screen Coordinates)

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

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

Чтобы конвертировать мировые координаты в экранные, необходимо использовать камеру и метод screenToWorld:

var camera = new pc.Camera();
var worldPosition = new pc.Vec3(10, 5, -10);
var screenPosition = camera.worldToScreen(worldPosition);

В этом примере мировые координаты точки (10, 5, -10) конвертируются в экранные координаты с учетом камеры, которая отображает эти координаты на экране.

Конвертация между системами координат

PlayCanvas предоставляет методы для конвертации координат между различными системами. Это очень важно, поскольку объекты могут быть представлены в разных системах координат в разные моменты времени, и необходимо уметь правильно преобразовывать их положения для корректного взаимодействия.

  1. Мировые в локальные: если нужно узнать позицию объекта в локальных координатах относительно его родителя, можно использовать метод getLocalPosition:
var worldPosition = new pc.Vec3(10, 5, 0);
var localPosition = parent.worldToLocal(worldPosition);
  1. Локальные в мировые: для того чтобы преобразовать локальные координаты объекта в мировые, используется метод getWorldPosition:
var localPosition = new pc.Vec3(2, 1, 0);
var worldPosition = parent.localToWorld(localPosition);
  1. Мировые в экранные: для преобразования мировых координат в экранные используется метод камеры worldToScreen:
var worldPosition = new pc.Vec3(10, 5, -10);
var screenPosition = camera.worldToScreen(worldPosition);
  1. Экранные в мировые: для получения мировых координат из экранных используется метод камеры screenToWorld:
var screenPosition = new pc.Vec2(200, 300);
var worldPosition = camera.screenToWorld(screenPosition, camera.nearClip);

Работа с ориентацией и вращением в разных системах координат

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

Локальное вращение — это вращение относительно родителя объекта, и оно сохраняет свою ориентацию в локальной системе координат. Например, вращение автомобиля относительно его кузова будет локальным.

Мировое вращение — это вращение относительно глобальной системы координат, когда объект вращается в целом в 3D-мире.

Пример установки локального вращения:

entity.setLocalEulerAngles(45, 0, 0);  // Вращение относительно родителя

Пример установки мирового вращения:

entity.setEulerAngles(45, 0, 0);  // Вращение относительно мировой системы координат

Заключение

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