3

当我浏览第 805 节的视频时,创建出色的 AR 体验,他们提到在 AR 中显示文本时使用屏幕空间文本。他们使用运行良好的 Measure 应用程序的示例。

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

4

2 回答 2

7

屏幕空间是显示器的 2D 像素坐标系。这是你通常做的事情,比如在屏幕空间中布置 UIKit 小部件等。

屏幕空间的替代方案是 3D 坐标空间,它与 ARKit 所做的 3D 世界跟踪或用于在 AR 中显示虚拟 3D 内容的 3D 渲染引擎相关。(在这种情况下,需要考虑多个 3D 空间,例如“绝对”世界空间与相机相对定位。)

正如 WWDC18 演讲“创造出色的 AR 体验”中所提到的,屏幕空间是一种很好的方式来显示本质上 2D 的内容(如文本),并且无论与内容相关联的现实世界特征的距离或方向如何,都可以保持可读性和。(如果您将该文本标签放置在世界空间中,当您远离时,它会变得很小且难以阅读。)

ARKit 没有为您提供任何自动方式让 2D 屏幕空间内容跟随 3D 世界空间位置,但您自己实现这一点并不是特别困难。UIView这是覆盖3D 位置后的 s的一般配方:

  1. ARAnchor在您希望屏幕空间内容出现的真实位置添加一个。
  2. 使用每帧回调(renderer(_:didUpdate:for:)或者renderer(_:updateAtTime:)如果您将 SceneKit 与 一起使用ARSCNViewsession(_:didUpdate:)如果您正在构建自己的渲染器)来获取该锚点的当前 3D 位置。
  3. 投影 3D 位置 ( ARSCNView projectPoint, ARCamera projectPoint) 以获得该 3D 位置出现在屏幕上的 2D 点。
  4. 设置您的位置UIView以匹配该点。

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

于 2018-07-09T19:28:28.537 回答
2

由于 iPhone 的运动传感器默认情况下,ARKit 中的世界(或绝对)坐标系面向重力(垂直轴)。ARKit 中的World Coordinates(在 3D 空间中)是固定的,iPhone 的前置/后置摄像头在这些坐标内移动。因此,如果您需要对 iPhone 的当前位置进行任何操作,您首先需要进行转换Camera Space(也在 3D 空间中)。

但是Screen Space(又名Projection Space)是 iPhone 屏幕的 2D 空间。一个小的 3D 对象(例如距离相机 100 米)可能会Screen Space在您的显示器上被视为一个红色像素。

我相信 WWDC'18 的演讲者会在 iPhone 屏幕上文本的强大可见性背景下向我们介绍屏幕空间。而已。

阅读这篇出色的矩阵帖子以了解更多详细信息。

于 2018-07-09T19:15:35.000 回答