В PlayCanvas для представления объектов в 3D-пространстве используется несколько разных типов координатных систем, каждая из которых играет ключевую роль при манипуляциях с объектами сцены. Все объекты, такие как модели, камеры, источники света и другие элементы, могут быть размещены и отображены в различных системах координат. Три важнейшие системы — это мировая (world), локальная (local) и экранная (screen) координатные системы.
Мировая система координат является глобальной системой для всего игрового мира. Все объекты, расположенные в сцене, существуют в рамках этой системы. Когда объект перемещается по сцене, его позиция и ориентация определяются относительно мировых координат. В PlayCanvas мировая система координат неизменна и используется для указания абсолютных позиций объектов в пространстве.
Позиция в мировой системе координат — это вектор, который указывает на точку, где находится объект относительно начала мирового координатного пространства (точки (0, 0, 0)).
Пример использования мировых координат:
var entity = new pc.Entity();
entity.setPosition(10, 5, 0); // Устанавливаем позицию в мировой системе координат
В этом примере объект будет размещен на координатах (10, 5, 0) в мировом пространстве, независимо от того, где находится родительский объект или сцена в целом.
Локальная система координат используется для задания положения объекта относительно его родительского объекта. Эта система полезна для иерархических структур, где один объект может быть вложен в другой. Например, в 3D-сценах объекты часто имеют родительские связи: это могут быть части машины, которые двигаются относительно кузова, или персонажи, которые двигаются относительно своих костей.
В локальной системе координат объект всегда находится в определенной связи с родителем, что означает, что его позиция и ориентация задаются относительно родительского объекта, а не глобального мира.
Пример использования локальных координат:
var parent = new pc.Entity();
var child = new pc.Entity();
parent.addChild(child);
child.setLocalPosition(2, 1, 0); // Устанавливаем позицию относительно родителя
В данном примере дочерний объект будет перемещен на (2, 1, 0) относительно родительского объекта. Важно понимать, что если родитель изменит свою позицию, дочерний объект автоматически будет двигаться вместе с ним, но всегда сохраняет локальное положение относительно родителя.
Экранная система координат используется для отображения объектов на экране. В отличие от мировых и локальных координат, экранные координаты зависят от разрешения экрана и размера окна браузера. Экранная система координат имеет начало в левом верхнем углу окна и ось 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 предоставляет методы для конвертации координат между различными системами. Это очень важно, поскольку объекты могут быть представлены в разных системах координат в разные моменты времени, и необходимо уметь правильно преобразовывать их положения для корректного взаимодействия.
getLocalPosition:var worldPosition = new pc.Vec3(10, 5, 0);
var localPosition = parent.worldToLocal(worldPosition);
getWorldPosition:var localPosition = new pc.Vec3(2, 1, 0);
var worldPosition = parent.localToWorld(localPosition);
worldToScreen:var worldPosition = new pc.Vec3(10, 5, -10);
var screenPosition = camera.worldToScreen(worldPosition);
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 более гибкой и эффективной.