ARKit - размер окна просмотра и реальное разрешение экрана

Я пишу приложение ARKit, которое использует ARSCNView hitTestфункция. Также приложение отправляет захваченные изображения на сервер для анализа.

Я замечаю, когда делаю:

let viewportSize = sceneView.snapshot().size
let viewSize = sceneView.bounds.size 

то первый вдвое больше второго.

Вопросы следующие:

  • 1. Почему есть разница?
  • 2. Какой "размер" (например, координаты) используется в HitTest?

1 ответ

Решение

Почему есть разница?

Давайте рассмотрим некоторые важные характеристики дисплея вашего iPhone 7:

  • разрешение 750 (Ш) x 1334 (В) пикселей (16: 9)
  • разрешение области просмотра 375 (Ш) x 667 (В) пикселей (16: 9)

Поскольку мобильные устройства с одинаковым размером экрана могут иметь очень разные разрешения, разработчики часто используют viewports при создании 3D-сцен или веб-страниц, удобных для мобильных устройств. В полях VR и AR: чем ниже разрешение, тем быстрее работает средство визуализации, и нагрузка на ЦП / ГП значительно меньше. Идея создания видовых экранов в основном используется для мобильных устройств. В macOSScreen Resolution а также Viewport Resolutionидентичны.

В iPhone, как и на других мобильных устройствах, Viewport- это уменьшенная версия (обычно в 2 или 3 раза меньшая по каждой оси) разрешения, которая позволяет более согласованно просматривать окна просмотра 3D-сцен или веб-сайты на разных устройствах и (что очень важно!) с меньшим энергопотреблением. Видовые экраны часто более стандартизированы и меньше размеров разрешения.

Снимки практически всегда отражают реальное разрешение экрана:

let viewportSize = sceneView.snapshot().size

/*   750 x 1,334    */
/*   iPhone 7 rez   */

Размер SceneView часто отражает стандартное разрешение экрана (в 4 раза меньше, чем указано в спецификации rez):

let viewSize = sceneView.bounds.size 

/*   375 x 667     */
/*   ViewPort rez  */

Соотношение сторон Viewport Rez (1/4) и Screen Rez в iPhone 7:

Схематическое изображение!

Размер области просмотра и его реальное расположение на мобильном устройстве:

Настоящее изображение!

Дополнительная ссылка: Phone X имеет разрешение ViewPort в девять раз меньше (375 x 812), чем разрешение экрана (1125 x 2436).


Какие координаты используются в Hit-Testing?

В Hit-Testing и Ray-Casting используются координаты ViewPort.

Давайте сделаем 3 нажатия, используя метод проверки попадания - сначала нажмите в верхнем левом углу (рядом с x=0 а также y=0), второе касание в центре экрана и третье касание в правом нижнем углу (рядом с x=667 а также y=375):

let point: CGPoint = gestureRecognize.location(in: sceneView)

print(point)

Координаты iPhone 7 Viewport напечатаны в консоли:

Quod Erat Demonstrandum!
Другие вопросы по тегам