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

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

在iOS 12中:是的!

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

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

有关详细信息,请参阅有关ARKit 2的WWDC18演讲或Apple的ARKit文档和示例代码 。

否则,可能不是。

在iOS 12之前,ARKit没有提供一种方法来使其本地世界映射的任何结果持久化。 您在AR会话中执行的所有操作,每个点,都只在该会话的上下文中定义。 如果您根据平面检测,命中测试和/或用户输入放置一些虚拟内容,则该位置的参照系相对于您的设备在会话开始时的位置。

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

但也许……

iOS 11.3中“ARKit 1.5”的增加之一是针对此问题的一种逃逸阀: 图像检测 。 如果您的应用程序的用例涉及已知/受控环境(例如,使用虚拟叠加层来指导美术馆中的访问者),并且在该环境中存在一些易于识别的2Dfunction(如着名的绘画),ARKit可以检测其位置。

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