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