Класс pc.CameraComponent: screenToWorld, worldToScreen

В библиотеке 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, таких как маркеры или метки, которые должны быть привязаны к конкретным объектам на экране.

Преобразование мировых координат в экранные помогает:

  1. Реализовать маркеры объектов — например, в играх для отображения индикаторов на экране, привязанных к определенным объектам 3D-сцены.
  2. Создавать эффекты UI, которые меняются в зависимости от положения объекта в пространстве.
  3. Реализовать выбор объектов с помощью мыши, где нужно перевести положение курсора на экран и вычислить, какой объект будет выбран в 3D-пространстве.

Пример использования:

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-сцене. Преобразование из экрана в мир и обратно может быть полезным для различных целей:

  • Взаимодействие с объектами: когда пользователь кликает на объект в 3D-пространстве, нужно преобразовать координаты мыши в мировые, чтобы точно определить, какой объект был выбран.
  • Динамические UI элементы: можно создавать элементы интерфейса, которые будут следовать за объектами в мире, оставаясь привязанными к ним даже при изменении положения камеры.

Особенности и ограничения

  1. Перспективные и ортографические камеры: При использовании перспективных камер преобразования будут учитывать искажения перспективы, в то время как для ортографической камеры (без перспективы) эти искажения отсутствуют.

  2. Глубина: Метод screenToWorld требует указания глубины. Это значение важно для определения точной позиции в мире, так как преобразование происходит в трехмерном пространстве. Если значение глубины выбрано неверно, результат может быть неточным.

  3. Проекция: Все преобразования между мировыми и экранными координатами зависят от проекционной матрицы камеры, которая используется для преобразования координат. Поэтому на результаты этих преобразований могут влиять настройки камеры, такие как поле зрения (FOV), положение и ориентация.

  4. Системы координат: Координаты экрана и мира различаются по своей системе отсчета. На экране ось Y направлена вниз, а в мировом пространстве ось Y обычно направлена вверх. Важно учитывать это при работе с методами, связанными с координатами.

Заключение

Методы screenToWorld и worldToScreen являются основными инструментами для работы с преобразованиями между экранным и мировым пространством в PlayCanvas. Они позволяют создавать точные и динамичные взаимодействия между пользователем и объектами 3D-сцены, открывая широкие возможности для создания интерфейсов и взаимодействий.