swift - ARKit – 视口大小与真实屏幕分辨率
问题描述
我正在编写一个使用 ARSCNViewhitTest
功能的 ARKit 应用程序。该应用程序还将捕获的图像发送到服务器进行一些分析。
当我这样做时,我会注意到:
let viewportSize = sceneView.snapshot().size
let viewSize = sceneView.bounds.size
那么第一个是第二个的两倍大。
问题是:
- 1.为什么有区别?
- 2.hitTest中使用了什么“大小”(例如坐标)?
解决方案
为什么有区别?
让我们来探索一下您的 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 Resolution
和Viewport 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 X
ViewPort 分辨率( 375 x 812 ) 比屏幕分辨率 ( 1125 x 2436 ) 小九倍。
命中测试中使用什么坐标?
在 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!
推荐阅读
- c++ - 我可以使用 Openssl C 库的哪些 API 来验证内容 id_rsa-cert.pub 文件?
- python - 取消绘制某个区域内的所有对象 Python 图形
- mysql - 计算两个文本列中匹配字符数的 SQL 查询
- python - django 属性错误 ------>AttributeError: module 'django.contrib.auth.views' has no attribute 'login', 'logout'
- powerapps - 如何在 PowerApps 中取消选择选定的库?
- r - 添加第二个轴以绘图而不同时添加跟踪
- javascript - 使用手机时 Socket.io 不显示连接
- php - 通过部分名称和变量混合调用函数
- intellij-idea - IntelliJ 2019.3 为什么我看不到“下一步”按钮?原因是什么?
- powershell - Powershell 中用户输入的通配符功能