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!