26

如果有的话,将 Apple 的新 ARKit 用于多个用户/设备的最佳方式是什么?

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

===Edit1,我尝试过的东西===

1) 特征点

我已经玩过暴露的原始特征点,现在我确信在他们目前的状态下,他们是一个死胡同:

  • 它们不是原始特征点,它们只暴露位置,但没有通常在跟踪特征点中发现的属性
  • 它们的实例化不会从一帧延续到另一帧,位置也不完全相同
  • 当相机输入几乎没有变化时,报告的特征点经常会发生很大的变化,要么出现要么消失。

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

2) 二维码

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

4

5 回答 5

10

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

要点:

  1. ARWorldMap将 ARKit 所知道的关于本地环境的所有内容都封装到一个可序列化的对象中,这样您就可以将其保存以备后用或将其发送到另一台设备。在后一种情况下,“重新定位”到由同一本地环境中的另一个设备保存的世界地图会为两个设备提供相同的参考系(世界坐标系)。

  2. 使用您选择的网络技术ARWorldMap在设备之间发送信息:AirDrop、云共享、信鸽等都可以工作,但 Apple 的Multipeer Connectivity 框架是一种很好、简单且安全的选择,因此 Apple 在他们的示例项目中使用了它。

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

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

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

以下是历史兴趣的原始答案...


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

特征点相对于会话定位,并且没有单独识别,所以我想在多个用户之间关联它们会很棘手。

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

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

祝你好运!

于 2017-06-14T04:36:57.593 回答
4

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

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

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

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

let configuration = ARWorldTrackingConfiguration()
configuration.initialWorldMap = worldMap
session.run(configuration)

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

于 2018-06-07T16:02:40.173 回答
1

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

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

  2. 手动保存玩家对齐手机,而不是像@Rickster 描述的那样通过图像分析检测真实世界的标记。

  3. 参与训练 Core ML 模型以识别 iPhone 和 iPad 及其摄像头位置。就像它是用人脸和眼睛完成的。在服务器上聚合数据,然后关闭 ML 以节省电量。注意:确保您的模型是防盖的。:)

于 2017-08-18T12:59:35.383 回答
0

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

于 2017-09-25T16:26:10.833 回答
0

这是一个非常困难的问题——正在研究它的最著名的初创公司是6D.ai。

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

于 2018-02-23T01:25:24.683 回答