ARKit的屏幕空间是什么意思?

Jag*_*put 3 augmented-reality wwdc ios arkit

当我浏览会话805的视频,创建出色的AR体验时,他们提到在AR中显示文本时使用屏幕空间文本.他们使用他们的Measure应用程序的例子非常有效.

我想实现类似的功能.但是,我无法弄明白.

ric*_*ter 7

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

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

正如WWDC18谈论创建优秀的AR体验中所提到的,屏幕空间是一种很好的方式来显示内在的2D(如文本)内容,无论内容相关的真实世界特征的距离或方向如何都是可读的用.(如果你要将那个文本标签放在世界空间中,那么当你走得很远时,它会变得很小而且不可读.)

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

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

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