首页 > 解决方案 > ARKit – 视口大小与真实屏幕分辨率

问题描述

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

当我这样做时,我会注意到:

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

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

问题是:

标签: swiftaugmented-realityscenekitarkitrealitykit

解决方案


为什么有区别?

让我们来探索一下您的 iPhone 7 的一些重要显示特性

  • 分辨率为 750 (W) x 1,334 (H) 像素(16 : 9)
  • 视口分辨率为 375 (W) x 667 (H) 像素(16 : 9)

由于具有相同屏幕尺寸的移动设备可能具有非常不同的分辨率,因此开发人员viewports在创建 3D 场景或移动友好网页时经常使用。在 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  */

iPhone 7 中的 Viewport Rez (1/4) 到 Screen Rez 纵横比:

示意图!

在此处输入图像描述

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

真实描绘!

在此处输入图像描述

附加参考:Phone XViewPort 分辨率( 375 x 812 ) 比屏幕分辨率 ( 1125 x 2436 ) 小九倍


命中测试中使用什么坐标?

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

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

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

print(point)

在此处输入图像描述

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

在此处输入图像描述

Quod Erat Demonstrandum!

推荐阅读