UE4 4.21中持久和共享的AR体验预览

ARKit 2.0增加了对持久和共享AR体验的支持。 在持久的情况下,您将扫描将要保存以供以后使用的世界区域,并以某种方式与该AR空间进行交互。 该数据将全部保存到一个文件中,以后可以加载该文件以重新访问场景(世界)以及与之保存的任何交互。 在共享的情况下,世界被扫描,传递给使用该数据共享同一AR空间的其他人。 这两个功能以相同的方式开头,不同之处在于,无论是文件流还是网络流,如何将数据传递给用户。

Epic Games在iOS 12和Xcode 10的Beta版发布后发布了4.20。 这个版本支持ARKit 2.0 API,但是没有足够的时间来创建示例来展示我们如何期望它们在UE4中使用。 对于4.21,我和Zak Parrish一直在努力想提供的AR样本列表中。 与该讨论相关的两个示例是ARSaveLoad和ARSharedWorld。

如前所述,此示例的用例是映射位置并进行一些AR操作,稍后可以再次进行访问。 它被命名为ARSaveLoad,以强调它所需的过程,先保存并在随后的应用程序启动时加载。 这是应用程序主菜单的外观。

第一步是创建一个要保存以供以后使用的AR场景。 单击创建按钮将带您进入我们标准手持式AR模板的变体。 可见平面后,您可以触摸该平面内的任何位置以生成形状。 然后,您需要扫描足够的区域以使AR场景进入映射状态。 此时,“保存”按钮将变为绿色,允许您对当前数据进行快照。 保存您的快照,然后关闭该应用程序。

单击加载按钮,您将再次返回AR场景映射。 它从保存场景的时间开始,并开始重新定位数据。 在将角色恢复到世界之前,需要完成重新定位,以便它们可以在相同的位置生成。 一旦达到这一点,就会显示以前存储的形状。 以下视频向您展示了运行示例。 请注意,保存AR数据时在相框中捕获了一张图片。 该图片可帮助您与以前的职位保持一致,以加快重新定位过程。

这是使用手持式AR模板开始会话时的标准流程。 它以您选择的配置对象开始会话,并添加调试菜单以钻取AR场景信息。 我将跳过基于触摸产生的形状,因为除了将新产生的形状添加到列表中以供以后迭代外,其他方法都是一样的。 场景映射完成后,我们可以将其保存到保存游戏位置。

组成保存对象的部分分为4部分:演员数据列表,摄像机图像快照,AR数据,最后是数据保存时间的时间戳。 对于每个演员,我们将存储他们的变换,颜色以及所使用的网格的ID,如下所示。

我们从相机流中捕获的预览图像和AR世界数据都是字节数组。 两项均被异步捕获和压缩。 我们的仅数据蓝图保存对象变量如下所示。

保存过程中有足够多的节点,因此我将图像分为多个部分。 第一部分向您展示如何存储参与者的特定信息。 创建一个新的保存游戏对象,访问每个参与者以构建我们之前看到的结构,并将新结构添加到保存参与者列表中。

保存角色后,我们要求ARKit将其对象图序列化为一个字节数组,并在后台对其进行压缩。 然后,使用相机图像创建根据当前设备方向旋转的JPEG。 使用Apple的图像处理API,可以在GPU上高效地完成旋转和JPEG创建。

最后一步是将数组存储到保存游戏对象中,并使引擎将该对象写入磁盘。 请注意,我们仅使用一个插槽进行保存,因此如果存在,它将覆盖以前的保存游戏。

保存AR场景后,您现在可以退出应用程序以运行加载过程。 由于此过程是分阶段进行的,因此该过程稍微复杂一些。 最初会加载所有数据,但是在重新定位跟踪之前,不应再次生成actor。 加载数据后,将从存储的jpeg数组创建预览图像。

压缩的AR对象图设置在配置对象上。 会议开始了,ARKit将从那里获取数据并将其用作重新定位过程的基础。

每帧都要检查AR映射状态,一旦映射了状态,就会触发一个事件以生成actor。

有一个删除保存按钮,但这对于设置您自己的持久或共享世界并不是很重要,因此我们在这里不再赘述。 您可以在4.21发布后,在我们的市场上发布AR示例集后,探索其蓝图。 请记住,蓝图流程或某些屏幕的外观可能有所不同。 这是即将发布的内容的预览,即使我从事此工作,Zak仍在完善这些内容。

正如我在本文开头提到的那样,共享AR场景以获得多人游戏体验与保存和加载示例的过程相同。 ARSharedWorld示例采用的路径略有不同。 在此示例中,您必须至少具有2个iDevice才能运行。 主持人为一个人,负责在共享的AR场景中进行扫描。 映射世界后,会话的主机可以通过UE4的内置网络代码与连接的客户端共享数据。 由于这是一个网络会话,因此该示例具有生成形状的功能,用户可以在其中触摸并为其添加网络支持。 这允许客户端或主机在共享的AR空间内在场景中生成形状。 每个玩家都有独特的颜色,因此您可以分辨出是谁产生了哪些形状。

为了方便潜在的大量二进制数据的传递,我为您的AR项目编写了一些C ++基类,以从中继承。 这些C ++类是ARSharedWorldGameMode,ARSharedWorldGameState,ARSharedWorldPlayerController。 游戏模式管理将数据编排到游戏中的每个玩家的流程。 游戏状态会在数据传递时保留下来,并触发一个事件,蓝图可以侦听完成状态。 玩家控制器会告诉游戏何时准备好接收数据,然后通过RPC调用将数据从主机路由到客户端。 玩家控制器通过是否已将游戏状态角色复制到它来确定其就绪状态。 连接后可能要花费一些时间,因此一旦客户端有了对象,玩家控制器便会通知游戏模式。 数据流如下所示:

  1. 主机等待连接
  2. 客户端连接
  3. 主机创建播放器控制器,开始将actor复制到客户端
  4. 客户端获取它的玩家控制器,开始轮询游戏状态
  5. 客户端收到游戏状态参与者,调用RPC函数ServerMarkReadyForReceiving()
  6. 主机等待被游戏通知AR数据已准备就绪,SetARWorldSharingIsReady()
  7. 主机使用预览图像大小和AR世界大小调用RPC函数ClientInitSharedWorld(),以便客户端可以显示进度
  8. 主机每个滴答调用2个RPC函数ClientUpdatePreviewImageData()和ClientUpdateARWorldData(),直到传递所有数据为止
  9. 客户端将数据块合并到游戏状态下存储的缓冲区中
  10. 收到所有数据后,客户端游戏状态会通知游戏
  11. 然后,客户端按照与ARSaveLoad中相同的步骤来加载AR世界

您可以在Engine / Source / Runtime / AugmentedReality中找到共享世界交付的所有源。 支持这些类的设置方式(进行中的加入和开始时的加入)。 如果客户端一开始就加入,则只有在主机绘制世界并交付数据之前,他们才会看到进度屏幕。 如果主机已经创建了其数据快照,那么在客户端加入并准备就绪时,流将开始。

注意:如果您在使客户端转换到映射状态时遇到麻烦,请确保两个设备都使用相同的方向(左横向,右横向,纵向)

以下是一些有关游戏体验的视频

这是客户端上游戏状态中的“蓝图”事件。

4.21版将提供代码和示例供您尝试。 如果您不介意自己下载源代码,可以从Dev-VR分支从GitHub立即获取。 如果您具有Perforce访问权限,则可以从// UE4 / Dev-VR获取代码。 这些源中没有示例内容,但是您将能够使用基础的C ++支持。 我们认为所有示例都将打包在一起,作为一个单独的下载文件。 目前,我们希望提供5项,但是我们将了解质量检查流程是如何完成的。

Zak Parrish对示例进行了所有修饰,包括添加一个更好的UI,组织蓝图以保持一致性,以及为蓝图添加注释。 您可以在保存/加载示例之前告诉共享世界示例中发生的清理。 当我们一起处理这些样本时,他也支持我,仅此一点就值得感谢。