ARKit 中的 Screen space 是什么意思?

What is mean by Screen space in ARKit?

当我观看第 805 节课的视频“创造出色的 AR 体验”时,他们提到在 AR 中显示文本时使用屏幕 space 文本。他们使用效果很好的 Measure 应用程序示例。

我想实现类似的功能。但是,我无法弄清楚。

ARKit中的世界(或绝对)坐标系由于iPhone的默认运动传感器。 ARKit 中的 World Coordinates(在 3D 中 space)是固定的,iPhone 的 front/rear 相机在这些坐标内移动。因此,如果您需要相对于 iPhone 的当前位置进行任何操作,您首先需要转换为 Camera Space(在 3D 中也是 space)。

但是 Screen Space(a.k.a。Projection Space)是 iPhone 屏幕的二维 space。一个小的 3D 对象(例如距离相机 100 米)可能会在您的显示器上被视为 Screen Space 中的红色像素。

我相信 WWDC'18 的主持人告诉我们关于 Screen Space 的背景下文本在 iPhone 屏幕上的可见性很强。就是这样。

阅读这篇优秀的 Matrices post 了解更多详情。

屏幕Space 是显示器的二维像素坐标系。在这里你通常可以做一些事情,比如在屏幕上布置 UIKit 小部件 space,等等

Screen Space 的替代项是 3D 坐标 space,它与 ARKit 所做的 3D 世界跟踪或用于在 AR 中显示虚拟 3D 内容的 3D 渲染引擎有关。 (在这种情况下,需要考虑多个 3D space,例如 "absolute" 世界 space 与相机相对定位。)

如 WWDC18 演讲 Creating Great AR Experiences 中所述,屏幕 space 是显示本质上是 2D 的内容(如文本)的好方法,无论距离或方向如何,都可以保持可读性与内容关联的真实世界特征。 (如果您将该文本标签放置在世界 space 中,它会随着距离变远而变小且难以辨认。)

ARKit 不会为您提供任何使 2D 屏幕-space 内容跟随 3D 世界-space 位置的自动方式,但您自己实现这一点并不是特别困难。这是在 3D 位置之后叠加 UIView 的一般方法:

  1. 在您希望屏幕显示内容的真实位置添加 ARAnchor-space。
  2. 使用每帧回调(renderer(_:didUpdate:for:) or renderer(_:updateAtTime:) if you're using SceneKit with ARSCNView, session(_:didUpdate:) 如果您正在构建自己的渲染器)获取该锚点的当前 3D 位置。
  3. 投影 3D 位置 (ARSCNView projectPoint, ARCamera projectPoint) 以获得该 3D 位置出现在屏幕上的 2D 点。
  4. 设置 UIView 的位置以匹配该点。

对于更高级的情况,例如 Measure 应用程序如何使其屏幕-space 标签平行于两个 3D 点之间的线,您需要投影两个端点并使用类似 atan2 获取旋转标签的角度。