ARKit – 视口大小与实际屏幕分辨率

ARKit – Viewport Size vs Real Screen Resolution

我正在编写一个使用 ARSCNView hitTest 函数的 ARKit 应用程序。该应用程序还将捕获的图像发送到服务器进行一些分析。

我注意到了:

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

那么第一个是第二个的两倍

问题是:

为什么会有差异?

让我们探讨一下 iPhone7:

的一些重要显示特征
  • 750 (W) x 1,334 (H) 像素的分辨率 (16 : 9)
  • 375 (W) x 667 (H) 像素的视口分辨率 (16 : 9)

由于具有相同屏幕尺寸的移动设备可能具有非常不同的分辨率,因此开发人员在创建 3D 场景或适合移动设备的网页时经常使用 viewports在 VR 和 AR 领域:分辨率越低 – 渲染器越快,CPU/GPU 负担大大减轻。创建视口的想法主要用于移动设备。 在 macOS 中 Screen ResolutionViewport Resolution 相同

在iPhone以及其他移动设备中,Viewport是按比例缩小的版本(每个轴通常缩小2或3倍) 的分辨率允许在不同设备上更一致地查看 3D 场景视口或网站,并且(非常重要!)消耗更少的能源。视口通常比分辨率尺寸更标准化且更小。

快照几乎总是反映真实屏幕分辨率

let screenSize = sceneView.snapshot().size

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

SceneView 大小通常反映标准化屏幕分辨率(比规格 rez 小 4 倍):

let viewportSize = sceneView.bounds.size 

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

Viewport Rez (1/4) to Screen Rez 纵横比 iPhone 7:

示意图!

视口大小及其在移动设备中的实际布局:

真实写照!

附加参考:Phone X 的 ViewPort 分辨率 9 倍 更小(375 x 812) 比屏幕分辨率 (1125 x 2436).


命中测试使用什么坐标?

在 Hit-Testing 和 Ray-Casting 中使用 ViewPort 坐标

让我们使用命中测试方法进行 3 次点击 - 第一次点击左上角(靠近 x=0y=0),第二次点击屏幕中央,第三次点击左下角右角(靠近 x=667y=375):

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

print(point)

坐标 iPhone 7 Viewport 打印在控制台中:

Quod Erat Demonstrandum!