ARKit 保存对象位置并在任何下一个会话中查看
Posted
技术标签:
【中文标题】ARKit 保存对象位置并在任何下一个会话中查看【英文标题】:ARKit save object position and see it in any next session 【发布时间】:2018-03-07 13:51:17 【问题描述】:我正在为一个使用 ARKit 的项目工作。我需要保存一个对象位置,我想在下一次应用程序启动时看到它。例如,在我的办公室里,我在门上贴了一些文字,然后回到家,第二天我希望在 ARKit 中可以看到的那个地方看到这些文字。
【问题讨论】:
【参考方案1】:在 ios 12 中:是的!
“ARKit 2”,又名适用于 iOS 12 的 ARKit,添加了一组 Apple 称之为“世界地图持久性和共享”的功能。您可以获取 ARKit 所知道的有关其本地环境的所有信息,包括您用于跟踪虚拟内容的真实世界位置的任何 ARAnchor
s,并将其保存在 ARWorldMap
对象中。
然后您可以将该对象序列化为一个文件,并稍后加载该文件以有效地恢复之前的 AR 会话(如果用户在同一本地环境中)。成功“重新定位”到世界地图后,您的会话具有与保存之前相同的 ARAnchor
s,因此您可以使用它来重新创建您的虚拟内容(例如,使用已保存/恢复锚点的 name
来决定显示哪个 3D 模型)。
有关详细信息,请参阅the WWDC18 talk on ARKit 2 或 Apple's ARKit docs and sample code。
否则,可能不会。
在 iOS 12 之前,ARKit 不提供使其本地世界映射的任何结果持久化的方法。您在 AR 会话中所做的一切、您定位的每个点都仅在该会话的上下文中定义。如果您根据平面检测、命中测试和/或用户输入放置一些虚拟内容,则该位置的参考框架与您的设备在会话开始时的位置相关。
由于没有可以跨会话持续存在的参考框架,因此无法定位虚拟内容,使其在(完全)退出/重新启动应用程序后看起来仍保持在相同的真实世界位置/方向。
但也许……
iOS 11.3 中“ARKit 1.5”的新增功能有点像解决这个问题的逃生阀:image detection。如果您的应用程序的用例涉及一个已知/受控的环境(例如,使用虚拟叠加层来引导艺术博物馆中的参观者),并且该环境中有一些易于识别的 2D 特征(例如著名的绘画),ARKit 可以检测它们的位置。
一旦您检测到您知道是环境的固定特征的图像锚点,您就可以告诉您的 AR 会话围绕该锚点重新定义其世界坐标系(请参阅setWorldOrigin
)。完成此操作后,您实际上拥有一个跨多个会话相同的坐标系(假设您检测到相同的图像并在每个会话中设置世界原点)。
【讨论】:
ARWorldMap 在存储快照和加载检查背景时是否起到基于标记的作用? ARWorldMap 不是基于标记的——它封装了 ARKit 在会话期间用于在其环境中定位解码的所有内容,包括特征点、检测到的平面等。 @rickster ,我是 Arkit 的新手。我想用 ARKit 从相机/画廊图像中检测物体(桌子、瓶子或特殊形状或任何东西)。我看到一些在项目中提供预定义图像的示例,然后它可以检测图像是否完全存在。但我不会这样做,我想让它学习以便它可以检测到任何桌子/瓶子?我需要使用 AirKit 来使用 Core ML 吗? Swift 的任何库/帮助?谢谢。以上是关于ARKit 保存对象位置并在任何下一个会话中查看的主要内容,如果未能解决你的问题,请参考以下文章
在 ARKit 中进行动画时如何获取 3D 对象的当前位置?
如何将 ARKit SCNNode 对象位置 SCNVector3 转换为纬度和经度? [关闭]
如何在没有 Geofire 的情况下将位置对象保存在 Firebase 中?