ARKit 保存对象位置并在下一个会话中查看它

ARKit save object position and see it in any next session

我正在为一个使用 ARKit 的项目工作。我需要保存一个对象位置,并且我希望在我的下一个应用程序启动时看到它曾经所在的位置。例如,在我的办公室里,我在门上贴了一些文字,然后回到家,第二天我希望在 ARKit 中可以看到那个地方的文字。

在iOS12:是!

"ARKit 2",又名 iOS 12 的 ARKit,添加了一组 Apple 调用的功能 "world map persistence and sharing"。您可以获取 ARKit 所知道的有关其本地环境的所有信息,包括您用来跟踪虚拟内容 real-world 位置的任何 ARAnchor,并将其保存在 ARWorldMap 对象中。

然后您可以将该对象序列化为一个文件,稍后加载该文件以有效地恢复较早的 AR 会话(如果用户处于相同的本地环境中)。成功 "relocalizing" 到世界地图后,您的会话具有与保存前相同的 ARAnchors,因此您可以将其用于 re-create 您的虚拟内容(例如使用 name 的 saved/restored 锚决定显示哪个 3D 模型)。

有关详细信息,请参阅 the WWDC18 talk on ARKit 2 or Apple's ARKit docs and sample code

否则,可能不会。

在 iOS 12 之前,ARKit 没有提供一种方法来使其 local-world 映射的任何结果持久化。您在 AR 会话中所做的一切、定位的每个点都仅在该会话的上下文中定义。如果您根据平面检测、命中测试、and/or 用户输入放置一些虚拟内容,则该位置的参考框架是相对于您的设备在会话开始时的位置。

由于没有可以跨会话持续存在的参考框架,因此无法定位虚拟内容,使其在(完全)[=] 之后看起来保持相同 real-world position/orientation 45=] 应用程序。

但也许...

iOS 11.3 中“ARKit 1.5”的一个补充是解决这个问题的逃生阀:image detection。如果您的应用的用例涉及 known/controlled 环境(例如,在艺术博物馆中使用虚拟叠加层引导游客),并且该环境中有一些易于识别的 2D 特征(例如著名的画作),ARKit 可以检测到它们职位。

一旦您检测到您知道是环境固定特征的图像锚点,您可以告诉您的 AR Session 重新定义其围绕该锚点的世界坐标系(参见 setWorldOrigin)。这样做之后,您实际上拥有一个跨多个会话相同的坐标系(假设您检测到相同的图像并在每个会话中设置世界原点)。