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
)。 在这之后,您实际上在多个会话中有一个相同的坐标系统(假设您检测到相同的图像并在每个会话中设置世界原点)。