当我浏览第 805 节的视频时,创建出色的 AR 体验,他们提到在 AR 中显示文本时使用屏幕空间文本。他们使用运行良好的 Measure 应用程序的示例。
我想实现类似的功能。但是,我无法弄清楚。
当我浏览第 805 节的视频时,创建出色的 AR 体验,他们提到在 AR 中显示文本时使用屏幕空间文本。他们使用运行良好的 Measure 应用程序的示例。
我想实现类似的功能。但是,我无法弄清楚。
屏幕空间是显示器的 2D 像素坐标系。这是你通常做的事情,比如在屏幕空间中布置 UIKit 小部件等。
屏幕空间的替代方案是 3D 坐标空间,它与 ARKit 所做的 3D 世界跟踪或用于在 AR 中显示虚拟 3D 内容的 3D 渲染引擎相关。(在这种情况下,需要考虑多个 3D 空间,例如“绝对”世界空间与相机相对定位。)
正如 WWDC18 演讲“创造出色的 AR 体验”中所提到的,屏幕空间是一种很好的方式来显示本质上 2D 的内容(如文本),并且无论与内容相关联的现实世界特征的距离或方向如何,都可以保持可读性和。(如果您将该文本标签放置在世界空间中,当您远离时,它会变得很小且难以阅读。)
ARKit 没有为您提供任何自动方式让 2D 屏幕空间内容跟随 3D 世界空间位置,但您自己实现这一点并不是特别困难。UIView
这是覆盖3D 位置后的 s的一般配方:
ARAnchor
在您希望屏幕空间内容出现的真实位置添加一个。renderer(_:didUpdate:for:)
或者renderer(_:updateAtTime:)
如果您将 SceneKit 与 一起使用ARSCNView
,session(_:didUpdate:)
如果您正在构建自己的渲染器)来获取该锚点的当前 3D 位置。ARSCNView
projectPoint
, ARCamera
projectPoint
) 以获得该 3D 位置出现在屏幕上的 2D 点。UIView
以匹配该点。对于更高级的情况,例如 Measure 应用程序如何使其屏幕空间标签与两个 3D 点之间的线平行,您需要投影两个端点并使用诸如atan2
获取旋转标签角度之类的函数。
由于 iPhone 的运动传感器默认情况下,ARKit 中的世界(或绝对)坐标系面向重力(垂直轴)。ARKit 中的World Coordinates
(在 3D 空间中)是固定的,iPhone 的前置/后置摄像头在这些坐标内移动。因此,如果您需要对 iPhone 的当前位置进行任何操作,您首先需要进行转换Camera Space
(也在 3D 空间中)。
但是Screen Space
(又名Projection Space
)是 iPhone 屏幕的 2D 空间。一个小的 3D 对象(例如距离相机 100 米)可能会Screen Space
在您的显示器上被视为一个红色像素。
我相信 WWDC'18 的演讲者会在 iPhone 屏幕上文本的强大可见性背景下向我们介绍屏幕空间。而已。
阅读这篇出色的矩阵帖子以了解更多详细信息。