В библиотеке PlayCanvas класс pc.CameraComponent играет
ключевую роль в управлении камерами и их взаимодействии с 3D-мирами.
Камера в PlayCanvas не только отображает сцену на экране, но и выполняет
важные математические преобразования, которые позволяют переключаться
между различными системами координат. Одними из самых востребованных
методов для таких преобразований являются screenToWorld и
worldToScreen. Оба метода позволяют переводить координаты
между различными пространствами — экранным и мировым.
screenToWorldМетод screenToWorld используется для преобразования
координат из экранной системы координат в мировую систему координат.
Экранная система координат в PlayCanvas имеет начало в левом верхнем
углу экрана с осями X и Y, где ось Y направлена вниз. Мировая система
координат, с другой стороны, представляет собой трехмерное пространство,
где объекты имеют свои координаты в пространстве сцены.
camera.screenToWorld(x, y, depth)
x, y — координаты точки на экране (в
пикселях).depth — глубина, на которой нужно определить мировые
координаты. Обычно это значение находится в диапазоне от 0 до 1, где 0 —
ближайшая точка к камере, а 1 — самая дальняя.Метод screenToWorld преобразует 2D-координаты, указанные
на экране, в 3D-координаты в мировом пространстве. Это полезно,
например, при реализации взаимодействий с объектами в сцене, когда
необходимо перевести позицию мыши на экране в координаты 3D-мира, чтобы
вычислить, какой объект пользователь нажимает или выбирает.
Если рассматривать пример использования, можно понять, как это работает в контексте камеры с перспективой. Пусть мы имеем точку на экране, которая соответствует определенному положению курсора мыши. Вектор, направленный от камеры в эту точку, можно преобразовать в мировые координаты, чтобы точно узнать, в какой точке сцены будет находиться объект, соответствующий данной экранной позиции.
var camera = this.app.root.findByName('Camera').camera;
var screenPos = new pc.Vec2(150, 100); // Позиция на экране
var depth = 10; // Глубина на мировой оси
var worldPos = camera.screenToWorld(screenPos.x, screenPos.y, depth);
console.log(worldPos); // Мировые координаты точки на экране
worldToScreenМетод worldToScreen выполняет обратную операцию —
преобразует мировые координаты в экранные. Это полезно, например, для
отображения информации о позиции объектов на экране, если известны их
мировые координаты, или для реализации отслеживания объектов, которые
находятся в 3D-пространстве.
camera.worldToScreen(x, y, z)
x, y, z — координаты точки в
мировом пространстве.Метод worldToScreen принимает трехмерные координаты
объекта в мире и преобразует их в двумерные координаты, которые
соответствуют экрану. Полученные координаты можно использовать,
например, для отображения элементов UI, таких как маркеры или метки,
которые должны быть привязаны к конкретным объектам на экране.
var camera = this.app.root.findByName('Camera').camera;
var worldPos = new pc.Vec3(10, 5, -20); // Мировая позиция объекта
var screenPos = camera.worldToScreen(worldPos.x, worldPos.y, worldPos.z);
console.log(screenPos); // Координаты экрана
screenToWorld и worldToScreenЭти два метода часто используются вместе в приложениях, которые требуют точного контроля за позиционированием объектов на экране и в 3D-пространстве. Например, при разработке интерфейсов, где требуется взаимодействие между пользователем и объектами в 3D-сцене. Преобразование из экрана в мир и обратно может быть полезным для различных целей:
Перспективные и ортографические камеры: При использовании перспективных камер преобразования будут учитывать искажения перспективы, в то время как для ортографической камеры (без перспективы) эти искажения отсутствуют.
Глубина: Метод screenToWorld
требует указания глубины. Это значение важно для определения точной
позиции в мире, так как преобразование происходит в трехмерном
пространстве. Если значение глубины выбрано неверно, результат может
быть неточным.
Проекция: Все преобразования между мировыми и экранными координатами зависят от проекционной матрицы камеры, которая используется для преобразования координат. Поэтому на результаты этих преобразований могут влиять настройки камеры, такие как поле зрения (FOV), положение и ориентация.
Системы координат: Координаты экрана и мира различаются по своей системе отсчета. На экране ось Y направлена вниз, а в мировом пространстве ось Y обычно направлена вверх. Важно учитывать это при работе с методами, связанными с координатами.
Методы screenToWorld и worldToScreen
являются основными инструментами для работы с преобразованиями между
экранным и мировым пространством в PlayCanvas. Они позволяют создавать
точные и динамичные взаимодействия между пользователем и объектами
3D-сцены, открывая широкие возможности для создания интерфейсов и
взаимодействий.