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

GNC*_*hti 0 position object save ios arkit

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

ric*_*ter 7

在 iOS 12 中:是的!

“ARKit 2”,又名 iOS 12 的 ARKit,增加了一组 Apple 称之为“世界地图持久化和共享”的功能。您可以获取 ARKit 了解的关于其本地环境的所有信息,包括ARAnchor您用来跟踪虚拟内容的真实世界位置的任何s,并将其保存在一个ARWorldMap对象中。

然后,您可以将该对象序列化为一个文件,并稍后加载该文件以有效地恢复较早的 AR 会话(如果用户处于同一本地环境中)。成功“重新定位”到世界地图后,您的会话具有与ARAnchor保存前相同的所有内容,因此您可以使用它来重新创建您的虚拟内容(例如,使用已name保存/恢复的锚点来决定要使用哪个 3D 模型)展示)。

有关更多信息,请参阅关于 ARKit 2 的 WWDC18 演讲Apple 的 ARKit 文档和示例代码

否则,可能不会。

在 iOS 12 之前,ARKit 不提供使其本地世界映射的任何结果持久化的方法。您在 AR 会话中所做的一切、您找到的每个点仅在该会话的上下文中定义。如果您根据平面检测、命中测试和/或用户输入放置一些虚拟内容,则该位置的参考框架与您的设备在会话开始时的位置有关。

由于没有可以跨会话持续存在的参考框架,因此无法定位虚拟内容,使其在(完全)退出/重新启动应用程序后保持在相同的真实世界位置/方向。

但也许...

iOS 11.3 中“ARKit 1.5”的新增功能之一是解决这个问题的一个逃生阀:图像检测。如果您的应用的用例涉及已知/受控环境(例如,使用虚拟叠加层在艺术博物馆中引导访客),并且该环境中有一些易于识别的 2D 特征(例如著名的绘画),则 ARKit 可以检测它们的位置。

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