具有多个用户的 ARKit



如果有的话,在多个用户/设备上使用Apple的新ARKit的最佳方法是什么?

似乎每个设备都有自己的场景理解。到目前为止,我最好的猜测是使用原始特征点位置并尝试在设备之间匹配它们以将不同的观点粘合在一起,因为 ARKit 不提供任何绝对的参考参考。

===编辑1,我尝试过的事情===

1) 特征点

我已经尝试并处理了暴露的原始特征点,我现在确信在当前状态下它们是死胡同:

它们不是原始特征点,
  • 它们仅显示位置,但不公开跟踪特征点中通常找到的任何属性
  • 它们的实例化不会在帧之间传递,位置也不完全相同
  • 经常发生的情况是,当相机输入几乎没有变化时,报告的特征点会发生很大变化,要么出现很多,要么消失很多。

所以总的来说,我认为尝试以某种有意义的方式使用它们是不合理的,无法在一个设备中进行任何良好的点匹配,更不用说几个了。 另一种方法是实现我自己的特征点检测和匹配,但这更能取代 ARKit,而不是利用它。

2)二维码

正如@Rickster所建议的,我还尝试识别一个易于识别的对象,如二维码,并从该固定点获得相对参考变化(见这个问题)这有点困难,暗示我使用一些 openCV 来估计相机姿势。但更重要的是非常有限

正如一些较新的答案所添加的那样,多用户AR是ARKit 2(在iOS 12上又名ARKit)的标题功能。关于 ARKit 2 的 WWDC18 演讲有一个很好的概述,Apple 有两个开发人员示例代码项目来帮助你入门:一个基本示例,只是让 2+ 设备进入共享体验,以及 SwiftShot,一个为 AR 构建的真正多人游戏。

要点:

  1. ARWorldMap将 ARKit 所知道的有关本地环境的所有内容打包到一个可序列化的对象中,因此您可以保存它以供以后使用或将其发送到其他设备。在后一种情况下,"重新定位"到同一本地环境中由另一台设备保存的世界地图会为两个设备提供相同的参考框架(世界坐标系)。

  2. 使用您选择的网络技术在设备之间发送ARWorldMap:AirDrop,云共享,信鸽等都可以工作,但Apple的多点连接框架是一个良好,简单和安全的选择,因此这是Apple在其示例项目中使用的。

  3. 所有这些都只为你提供了创建共享体验的基础- 在多个设备上的应用上使用与相同真实世界环境对齐的世界坐标系的多个副本。这就是让多个用户体验相同的静态AR内容所需要的一切,但是如果你想让他们在AR中互动,你需要更多地使用你最喜欢的网络技术。

    苹果的基本多用户AR演示展示了对ARAnchor进行编码 并将其发送给同行,以便一个用户可以点击以放置 3D 世界上的模型和所有其他人都可以看到它。SwiftShot 游戏示例构建了一个完整的网络协议,以便所有用户都能获得相同的游戏动作(例如相互发射弹弓)和同步的物理结果(例如块在被击中后掉落)。两者都使用多对等连接。

(顺便说一句,上面的第二点和第三点是你从@andy的答案中得到"2到6"数字的地方——ARKit方面没有限制,因为ARKit不知道有多少人可能收到了你保存的世界地图。但是,多对等连接有 8 个对等限制。在此基础上构建的任何游戏/应用程序/体验都可能会在添加更多对等项时出现延迟/性能扩展问题,但这取决于您的技术和设计。

出于历史兴趣,下面的原始答案...


这似乎是iOS开发者社区积极研究的一个领域——上周我在WWDC上遇到了几个试图弄清楚的团队,甚至还没有人开始破解它。所以我不确定是否有"最佳方法",甚至没有可行的方法。

特征点相对于会话定位,并且不是单独标识的,因此我认为在多个用户之间关联它们会很棘手。

会话对齐模式gravityAndHeading可能会有所帮助:它将所有方向固定到(假定/估计为)绝对参考系,但位置仍然相对于会话开始时设备的位置。如果你能找到一种方法来将这个位置与绝对的东西联系起来——经度/经度,或者也许是iBeacon——并且足够精确地做到这一点......那么,你不仅会有一个可以被多个用户共享的参考框架,你还会拥有基于位置的AR的主要成分。 (你知道,就像一个浮动的虚拟箭头,上面写着转到达机场的A113登机口,或者其他什么。

我听说讨论的另一个途径是图像分析。如果你可以放置一些真正的标记——很容易机器识别的东西,比如二维码——在多个用户面前,你也许可以使用某种形式的对象识别或跟踪(也许是ML模型?)来精确识别标记相对于每个用户的位置和方向,并从那里回来计算一个共享的参考框架。不知道这有多可行。(但如果你走这条路或类似的路线,请注意 ARKit 会为每个捕获的相机帧公开一个像素缓冲区。

祝你好运!

现在,在WWDC 2018上发布ARKit 2.0之后,可以为2....6用户制作游戏。

为此,您需要使用ARWorldMap类。通过保存world maps并使用它们启动新会话,您的 iOS 应用程序现在可以添加新的增强现实功能:多用户和持久 AR 体验。

AR 多用户体验。现在,您可以通过将存档的ARWorldMap对象发送到附近的iPhone或iPad来创建参考的共享帧。在多台设备同时跟踪同一world map的情况下,您可以构建一种体验,所有用户(最多 6 个)都可以共享和查看相同的虚拟 3D 内容(在 Xcode 10+ 和 iOS 12+ 中使用皮克斯的USDZ3D 文件格式)。

session.getCurrentWorldMap { worldMap, error in 
guard let worldMap = worldMap else {
showAlert(error)
return
}
}
let configuration = ARWorldTrackingConfiguration()
configuration.initialWorldMap = worldMap
session.run(configuration)

AR 持久体验。如果您保存了world map,然后您的iOS应用程序变为非活动状态,则可以在下次启动应用程序时在同一物理环境中轻松还原它。您可以使用恢复world map中的ARAnchors将相同的虚拟 3D 内容(USDZ 或 DAE 格式)放置在上一个保存会话的相同位置。

不是防弹的答案更像是解决方法,但也许你会发现这些有帮助。 所有人都假设玩家在同一个地方。

  1. DIYARKit在AR会话启动后快速设置其世界坐标系。因此,如果您可以让所有玩家一个接一个地将他们的设备放置并对齐到相同的物理位置,并让他们在那里开始会话,那么您就可以开始了。想象一下,L方形尺子的内边缘固定在可用的任何东西上。或任何有孔的平面:再次按住手机表面,用相机通过孔看,(重新)初始化会话。

  2. 保存手动对齐手机的播放器,而是使用图像分析检测真实世界的标记,就像@Rickster描述的那样。

  3. 参与训练核心 ML 模型以识别 iPhone 和 iPad 及其相机位置。就像人类的脸和眼睛一样。聚合服务器上的数据,然后关闭 ML 以节省电量。注意:确保您的模型是防盖的。:)

我正在更新我的游戏控制器框架 (https://github.com/robreuss/VirtualGameController) 以支持共享控制器功能,因此所有设备都将从所有设备屏幕上的控制元素接收输入。 此增强功能的目的是支持基于 ARKit 的多人游戏功能。 我假设开发人员将使用diviaki 提到的第一种方法,其中虚拟空间的一般定位是通过从物理空间中的公共点(共享引用)在每个设备上启动会话来定义的,特别是我想到的是桌子的两侧。 所有设备将同时启动游戏,并利用相对于物理大小的公共坐标空间,并且使用来自所有控制器的输入,游戏理论上将在所有设备上保持同步。 仍在测试中。 明显的潜在问题是网络的延迟或中断,同步会分崩离析,除非重新启动游戏,否则很难恢复。该方法和框架可能适用于某些类型的游戏 - 例如,简单的街机风格的游戏,但肯定不适用于许多其他游戏 - 例如,任何具有显着随机性的游戏,无法跨设备协调。

这是一个非常困难的问题 - 正在研究它的最突出的创业公司是 6D.ai。

"多人AR"与持久SLAM是相同的问题,您需要将自己定位在可能不是自己构建的地图中。这是大多数自动驾驶汽车公司都在积极解决的问题。

相关内容

  • 没有找到相关文章

最新更新