Что означает экранное пространство в ARKit?

Когда я просмотрел видео для сеанса 805 "Создание великолепного опыта AR", и в нем упоминалось использование текста на экране при отображении текста в AR. Они используют пример своего приложения Measure, которое работает довольно хорошо.

Я хочу добиться аналогичной функциональности. Но я не в состоянии понять это.

2 ответа

Решение

Пространство экрана - это двухмерная пиксельная система координат вашего дисплея. Здесь вы обычно делаете такие вещи, как размещение UIKit-виджетов в пространстве экрана и т. Д.

Альтернативой Screen Space является трехмерное координатное пространство, которое относится к отслеживанию трехмерного мира, которое выполняет ARKit, или к механизму трехмерного рендеринга, который вы используете для отображения виртуального трехмерного контента в AR. (В этом случае нужно рассмотреть несколько трехмерных пространств, например, "абсолютное" мировое пространство или позиционирование относительно камеры.)

Как упоминалось в докладе WWDC18 " Создание великолепного опыта AR", экранное пространство является отличным способом отображения контента, который по своей сути является двумерным (например, текст), таким образом, чтобы он оставался читаемым, независимо от расстояния или ориентации реальной функции, с которой связан контент. с. (Если бы вы поместили эту текстовую метку в мировое пространство, она стала бы маленькой и нечитаемой, когда вы ушли очень далеко.)

ARKit не дает вам никакого автоматического способа заставить контент 2D-экрана следовать за позицией 3D-пространства в мире, но сделать это самостоятельно не особенно сложно. Вот общий рецепт для наложения UIView s, которые следуют за 3D-позициями:

  1. Добавить ARAnchor в реальной позиции, где вы хотите, чтобы контент в пространстве экрана появлялся.
  2. Используйте обратный вызов для каждого кадра (renderer(_:didUpdate:for:) или же renderer(_:updateAtTime:) если вы используете SceneKit с ARSCNView, session(_:didUpdate:) если вы создаете свой собственный рендерер), чтобы получить текущую трехмерную позицию этого якоря.
  3. Спроецировать 3D-позицию (ARSCNViewprojectPoint, ARCameraprojectPoint), чтобы получить точку 2D, где эта трехмерная позиция появляется на экране.
  4. Установите положение вашего UIView чтобы соответствовать этой точке.

Для более сложных случаев, например, как приложение Measure делает метку пространства экрана параллельной линии между двумя трехмерными точками, вам необходимо спроецировать две конечные точки и использовать функцию, например atan2 чтобы получить угол поворота этикетки.

Мировая (или абсолютная) система координат в ARKit по умолчанию ориентирована на гравитационную силу (вертикальная ось) благодаря датчикам движения iPhone. World Coordinates (в трехмерном пространстве) в ARKit исправлены, и передняя / задняя камера вашего iPhone перемещается в этих координатах. Так что, если вам нужно сделать какие-либо манипуляции относительно текущей позиции вашего iPhone, вам сначала нужно сделать преобразование в Camera Space (это также в трехмерном пространстве).

Но Screen Space (ака Projection Space) - это 2D пространство экрана вашего iPhone. Небольшой трехмерный объект (например, в 100 метрах от камеры) может быть виден как красный пиксель в Screen Space на вашем дисплее.

Я полагаю, что ведущий WWDC'18 рассказывает нам о пространстве экрана в контексте четкой видимости текста на экране вашего iPhone. Вот и все.

Прочитайте этот превосходный пост Матрицы для более подробной информации.

Другие вопросы по тегам