ARKit有多个用户
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ARKit有多个用户相关的知识,希望对你有一定的参考价值。
如果有的话,将Apple的新ARKit用于多个用户/设备的最佳方式是什么?
似乎每个设备都有自己独立的场景理解。到目前为止,我最好的猜测是使用原始特征点位置并尝试在不同设备上匹配它们以将不同的视点粘合在一起,因为ARKit不提供任何绝对参考参考。
=== Edit1,我尝试过的东西===
1)特征点
我已经玩过暴露的原始特征点,我现在确信在他们目前的状态下他们是死路一条:
- 它们不是原始要素点,它们只显示位置,但通常在跟踪的要素点中找不到任何属性
- 它们的实例化不会逐帧进行,位置也不完全相同
- 当相机输入几乎没有变化时,经常发生报告的特征点变化很多,其中很多都出现或消失。
总的来说,我认为尝试以某种有意义的方式使用它们是不合理的,不能在一个设备中进行任何类型的好点匹配,更不用说几个。替代方案将实现我自己的特征点检测和匹配,但这将更多地取代ARKit而不是利用它。
2)QR码
正如@Rickster建议的那样,我也尝试识别一个易于识别的对象,如QR码,并从该固定点获得相对参考变化(参见this question)这有点困难,并暗示我使用一些openCV来估计相机姿势。但更重要的是非常有限
现在,在2018年WWDC上发布ARKit 2.0之后,可以为2到6个用户制作游戏。
为此你需要使用ARWorldMap
类。通过保存world maps
并使用它们来启动新会话,您的ios应用程序现在可以添加新的增强现实功能:多用户和持久性AR体验。
AR多用户体验。现在,您可以通过将存档的ARWorldMap
对象发送到附近的iPhone或iPad来创建参考的共享框架。有几个设备同时跟踪相同的world map
,您可以构建一种体验,所有用户(最多6个)可以共享和查看相同的虚拟3D内容(在Xcode 10和iOS 12中使用全新的Pixar的USDZ
文件格式用于3D)。
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应用程序变为非活动状态,您可以在下次启动应用程序和相同的物理环境中轻松恢复它。您可以使用恢复的ARAnchors
中的world map
将相同的虚拟3D内容(以USDZ或DAE格式)放置在上一个保存会话的相同位置。
随着一些新的答案的增加,多用户AR是ARKit 2(iOS 12上的ARKit)的标题功能。 The WWDC18 talk on ARKit 2有一个很好的概述,Apple有两个开发人员示例代码项目可以帮助你入门:一个basic example,只有2个以上的设备进入共享体验,SwiftShot,一个真正的多人游戏为AR构建。
主要观点:
ARWorldMap
将ARKit了解本地环境的所有内容包装成可序列化的对象,因此您可以将其保存以供日后使用或将其发送到其他设备。在后一种情况下,“重新定位”到由同一本地环境中的另一个设备保存的世界地图,为两个设备提供相同的参照系(世界坐标系)。- 使用您选择的网络技术在设备之间发送
ARWorldMap
:AirDrop,云共享, 载体鸽 等所有工作,但Apple的Multipeer Connectivity framework是一个好的,简单的,安全的选项,所以它是Apple在他们的示例项目中使用的。 - 所有这些只为您提供了创建共享体验的基础 - 您的应用程序在多个设备上的多个副本都使用与相同的真实环境排列的世界坐标系统。这就是让多个用户体验相同的静态AR内容所需的一切,但如果您希望他们在AR中进行交互,您将需要使用您喜欢的网络技术。
Apple的basic multiuser AR demo显示编码
ARAnchor
并将其发送给同行,这样一个用户就可以点击在世界上放置3D模型,其他所有人都可以看到它。 SwiftShot game example构建了一个完整的网络协议,以便所有用户都能获得相同的游戏动作(比如相互射击弹弓)和同步的物理结果(比如被击中后的块掉落)。两者都使用Multipeer Connectivity。
(顺便说一句,上面的第二点和第三点是你从@andy's answer获得“2到6”数字的地方 - 对ARKit方面没有限制,因为ARKit不知道有多少人可能收到你保存的世界地图。但是, Multipeer Connectivity具有8个对等限制。无论您在此基础上构建的游戏/应用程序/体验,都可能会在添加更多对等项时出现延迟/性能扩展问题,但这取决于您的技术和设计。)
以下原始答案的历史兴趣......
这似乎是iOS开发者社区中一个积极研究的领域 - 我在上周遇到了几个试图在WWDC上解决这个问题的团队,而且还没有人开始破解它。所以我不确定还有一种“最佳方式”,即使是一种可行的方式。
特征点相对于会话定位,并且没有单独识别,因此我认为在多个用户之间关联它们会很棘手。
会话对齐模式gravityAndHeading
可能会有用:它将所有方向固定为(假定/估计为)绝对参考帧,但位置仍然相对于会话开始时设备的位置。如果你能找到一种方法将这个位置与绝对的东西联系起来 - 一个纬度/长度,或者一个iBeacon可能 - 并且可靠地做到这一点,并且具有足够的精度......那么,你不仅可以有一个参考框架由多个用户共享,您还拥有基于位置的AR的主要成分。 (你知道,就像一个浮动的虚拟箭头,说在那里转到机场的A113门,或者其他什么。)
我听过的另一个途径是图像分析。如果你可以放置一些真正的标记 - 很容易识别像QR码这样的东西 - 考虑到多个用户,你可以使用某种形式的物体识别或跟踪(ML模型,也许?)来精确识别标记的位置和方向相对于每个用户,并从那里回来计算共享的参考框架。不知道可能是多么可行。 (但是如果你去那条路线或类似的路线,请注意每个捕获的相机框架的ARKit exposes a pixel buffer。)
祝好运!
不是防弹的答案更像是解决方法,但也许你会发现这些有用。所有人都认为球员都在同一个地方。
- AR AR会在AR会话启动后快速设置其世界坐标系。因此,如果你可以让所有玩家一个接一个地将他们的设备放到相同的物理位置并让他们在那里开始会话,你就去了。想象一下L方形标尺的内边缘固定在任何可用的位置。或者任何带孔的平面:用手持镜头再次握住手机表面,通过相机,(重新)初始化会话。
- 中等保存播放器手动对齐手机,而不是像@Rickster描述的那样通过图像分析检测真实世界标记。
- 参与训练核心ML模型识别iPhone和iPad及其摄像机位置。就像人脸和眼睛一样。聚合服务器上的数据,然后关闭ML以节省电量。注意:确保您的模型具有防护功能。 :)
我正在更新我的游戏控制器框架(https://github.com/robreuss/VirtualGameController)以支持共享控制器功能,因此所有设备都将从所有设备的屏幕上的控制元素接收输入。此增强功能的目的是支持基于ARKit的多人游戏功能。我假设开发人员将使用diviaki提到的第一种方法,其中虚拟空间的一般定位是通过从物理空间中的公共点开始每个设备上的会话来定义的,共享参考,特别是我想到的是在桌子的两边。所有设备将同时启动游戏并利用相对于物理尺寸的公共坐标空间,并且使用来自所有控制器的输入,游戏在理论上将在所有设备上保持同步。还在测试。显而易见的潜在问题是网络中的延迟或中断以及同步崩溃,除非重新启动游戏,否则很难恢复。这种方法和框架可以很好地适用于某些类型的游戏 - 例如,简单的街机风格游戏,但肯定不适用于许多其他游戏 - 例如,任何具有无法跨设备协调的重要随机性的游戏。
这是一个非常困难的问题 - 正在研究它的最着名的创业公司是6D.ai。
“多人游戏AR”与持久性SLAM存在同样的问题,您需要将自己定位在自己可能没有构建的地图中。这是大多数自驾车公司正在积极努力的问题。
以上是关于ARKit有多个用户的主要内容,如果未能解决你的问题,请参考以下文章
全球最大 AR 3D 模型平台 Sketchfab 宣布支持 ARKit,或联手腾讯阿里进军中国