Swift 具有多个用户的ARKit

Swift 具有多个用户的ARKit,swift,augmented-reality,ios11,arkit,multiplayer,Swift,Augmented Reality,Ios11,Arkit,Multiplayer,在多个用户/设备上使用苹果新ARKit的最佳方式是什么(如果有的话) 似乎每个设备都有各自的场景理解。到目前为止,我最好的猜测是使用原始特征点位置,并尝试在设备之间进行匹配,以将不同的视图点粘合在一起,因为ARKit不提供任何绝对参考 我试过的东西=== 1) 特征点 我已经尝试过暴露的原始特性点,现在我确信,在它们当前的状态下,它们是一条死胡同: 它们不是原始特征点,它们只显示位置,但不显示通常在跟踪特征点中找到的属性 它们的实例化不会从一帧延续到另一帧,位置也不完全相同 通常情况下,当相机

在多个用户/设备上使用苹果新ARKit的最佳方式是什么(如果有的话)

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

我试过的东西===

1) 特征点

我已经尝试过暴露的原始特性点,现在我确信,在它们当前的状态下,它们是一条死胡同:

  • 它们不是原始特征点,它们只显示位置,但不显示通常在跟踪特征点中找到的属性
  • 它们的实例化不会从一帧延续到另一帧,位置也不完全相同
  • 通常情况下,当相机输入几乎不变时,报告的特征点会发生很大的变化,要么大量出现,要么大量消失
因此,总的来说,我认为试图以某种有意义的方式使用它们是不合理的,不能在一台设备内进行任何良好的点匹配,更不用说几个了。 替代方案是实现我自己的特征点检测和匹配,但这将更多地取代ARKit而不是利用ARKit

2) 二维码


正如@Rickster所建议的,我还尝试识别一个容易识别的对象,比如二维码,并从该固定点获取相对参考变化(参见)。这有点困难,并暗示我使用一些openCV来估计相机姿势。但更重要的是,正如一些较新的答案所补充的那样,多用户AR是ARKit 2(iOS 12上的又称ARKit)的一个标题功能。有一个很好的概述,苹果有两个开发人员示例代码项目可以帮助您入门:一个是将2+设备加入共享体验的项目,另一个是为AR构建的真正的多人游戏

要点:

  • 将ARKit了解的有关本地环境的所有信息打包到一个可序列化对象中,以便您可以将其保存以备将来使用,或将其发送到其他设备。在后一种情况下,“重新定位”到另一台设备在同一本地环境中保存的世界地图会使两台设备具有相同的参照系(世界坐标系)

  • 使用您选择的网络技术在设备之间发送
    ARWorldMap
    :空投、云共享、信鸽等都可以,但苹果的是一个好的、简单的、安全的选择,因此苹果在其示例项目中使用了这一技术

  • 所有这些只为您提供了创建共享体验的基础—在多台设备上的应用程序上创建多个副本,所有副本都使用与同一真实世界环境一致的世界坐标系。这就是让多个用户体验相同的静态AR内容所需的全部内容,但是如果您希望他们在AR中进行交互,则需要更多地使用您喜爱的网络技术

    苹果展示了编码一个
    ARAnchor
    并将其发送给其他用户,以便一个用户可以点击以放置3D图像 世界上的模特和所有其他人都能看到它。构建了一个完整的网络协议,这样所有用户都可以获得相同的游戏操作(比如相互发射弹弓)和同步的物理结果(比如被击中后掉下来的方块)。两者都使用

  • (顺便说一句,上面的第二点和第三点是你得到“2到6”的地方figure from-ARKit方面没有限制,因为ARKit不知道有多少人收到了您保存的世界地图。但是,多点连接有8个对等点的限制。并且,无论您在此基础上构建什么游戏/应用程序/体验,当您添加更多对等点时,可能会出现延迟/性能扩展问题,但这取决于您的t技术和设计。)

    以下是关于历史利益的原始答案


    这似乎是iOS开发者社区中一个活跃的研究领域——上周我在WWDC上遇到了几个团队,他们试图解决这个问题,甚至还没有人开始破解它。所以我不确定是否有一个“最好的方法”,即使是一个可行的方法

    功能点是相对于会话定位的,并且不是单独标识的,因此我认为在多个用户之间关联它们是很困难的

    会话对齐模式可能会有帮助:它将所有方向固定到(假定/估计为)绝对参考帧,但位置仍然相对于会话启动时设备所在的位置。如果你能找到一种方法,将这个位置与某个绝对值联系起来——一个纬度/长度,或者一个iBeacon——并以足够的精度可靠地做到这一点。。。那么,你不仅有一个可以被多个用户共享的参考框架,还有基于位置的AR的主要成分(你知道,就像一个漂浮的虚拟箭头,上面写着向右拐,到机场A113号门,或者其他什么地方)

    我听说讨论的另一个途径是图像分析。如果你能在多个用户面前放置一些真正的标记——容易机器识别的东西,如QR码,你可以使用某种形式的对象识别或跟踪(可能是ML模型?)来精确识别标记相对于每个用户的位置和方向,然后从那里计算出一个共享的参考系。不知道这有多可行。(但如果您选择该路线或类似路线,请注意,对于每个捕获的相机帧。)


    祝你好运

    不是防弹答案,更像是权宜之计,但也许你会发现这些答案很有用。 所有人都假设玩家在同一个地方

  • DIYARKit在AR会话开始后快速设置其世界坐标系。因此,如果你可以让所有玩家,一个接一个,把他们的设备放在同一个物理位置,并让他们在那里开始会话,就这样了。想象一下L形方尺的内缘
    session.getCurrentWorldMap { worldMap, error in 
        guard let worldMap = worldMap else {
            showAlert(error)
            return
        }
    }
    
    let configuration = ARWorldTrackingConfiguration()
    configuration.initialWorldMap = worldMap
    session.run(configuration)