6789a98b1b71fc0d115c8a4411eb1d79
WWDC20 10612 - What's new in RealityKit

前言

本文是基于 WWDC2020 10612 What's new in RealityKit Session 整理而成,阅读本文需要有 ARKit、RealtyKit、AVPlayer 相关知识储备。这次 RealityKit 新特性增强了虚拟实体和现实世界的互动,让构建的场景更逼真、趣味。

新增功能

  • Video materials,这次 RealityKit 新功能允许将视屏用作 RealityKit 中的 Materials
  • 借助 LiDAR 新增 Scene understanding,能将现实界带入到虚拟环境,因此可以实现虚拟内容与现实世界互动
  • 改进了渲染调试,新增调试模拟组件,可以检查Entity渲染相关的各种属性
  • ARKit 4 扩展了其面部跟踪支持,可以在更多设备上使用
  • ARKit 4 还新增了 Location anchors,使用它可以将虚拟的 AR 实体放置在现实世界中的特定位置

Video materials

现在让我们深入研究这些新功能,并了解如何使用他们。

上图中可以看到,视屏材料被用给了图中虚拟物体使其身体和眼睛闪闪发光,Video Materials 可以使虚拟实体拥有随时间变化的纹理。我们从视屏中获取纹理可以实现很多事情,例如:使用它模拟看到的发光效果、也可以提供视屏说明等。
视屏材料还能播放空间音频(指声源的作用就像从特定位置发出),当将视屏应用到Entity时,该 Entity 将成为空间音频源。
既然知道了 Video Materials 是什么,我们该如何使用它们?

首先,我们需要加载视屏资源。RealityKit利用AVFoundation的AVPlayer的功能加载视屏源,一旦有了 AVPlayer 对象,就可以用它来创建 Video Material。

// 使用 AVFoundation 加载视屏
let asset = AVURLAsset(url: Bundle.main.url(forResource: "glow", withExtension: "mp4")!)
let payerItem = AVPlayerItem(asset: asset)


接下来,我们可以用AVPlayer创建ViewMaterial对象,ViewMaterail和RealityKit其他的Material一样可以分配到Entity实体上。

let player = AVPlayer()
bugEntity.materials = [VideoMaterial(player: player)]

通过上述过程我们可以给 Entity 实体分配 View Material 材料,现在我们可以使用 AVPlayer 播放器控制视屏。

player.replaceCurrentItem(with: playerItem)
player.play()
  1. 我们可以使用 AVPlayerLooper 循环播放
  2. 也可以使用 AVQueuePlayer 顺序播放视屏队列
  3. 最后甚至可以使用 HTTP Live 流提供远程的媒体流。

想了解更多内容可以参考 WWDC 2016 中关于 AVFoundation 的 Session。

Scene understanding

Scene understanding 的主要目的是实现虚拟内容与现实世界互动,为了达成这样的目的我们需要将现实世界与虚拟内容融合。要做到这一点,需要从 ARVIew 开始:

AEView 有个 Environment 结构体属性,它可以设置与现实环境相关的配置。例如:背景图片、环境灯光以及空间音频,我们认为这些都是现实环境的一部分。这次新增了 Scene understanding 选项集,视频材料允许您将视频用作 RealityKit 中的材料。

Scene understanding 有四个选项集:

  • Occlusion(遮挡),真实世界的物体会遮挡虚拟世界的物体
  • Receives ligthing(接受光照),虚拟物体会在真实世界表面投射阴影
  • Physics(物理学),虚拟对象的行为可以与现实世界进行物理交互
  • Collision(碰撞),可以生成碰撞事件,并且可以对现实世界 Ray-cast

最后,设置了Receives lighting 会自动打开 Occlusion,Physics 会自动打开 Collision。

Occlusion


上图可以看出,左边没有遮挡效果,虚拟实体始可见;有遮挡效果的右边,虚拟实体隐藏在了树的后面,遮挡效果提高了增强现实的效果。
要想使用遮挡只需将 .occlusion 加到 Scene understanding 中。

arView.environment.sceneUnderstanding.options.insert(.occlusion)

Receives lighting


左边是没有 Receives lighting 的虚拟实体,由于缺少阴影,该虚拟物体看起来像漂浮的。
右边是带有 Receives lighting 的虚拟实体,它接受了光照在地板上投下了阴影,看上去像接地了。

arView.environment.sceneUnderstanding.options.insert(.receivesLighting)

由于投射的阴影是在真实世界的曲面,因此不需要将这些对象 Anchor 固定到水平面。也就是说虚拟世界的实体都会在现实世界投射阴影。需要特别注意的是,模仿的阴影是直射向下的光线。这意味着,在竖直的墙面上不会看到阴影。

Physics


以前在ARKit中,我们仅能使用平面或各种图元素来表示现实世界,这是不现实的,因为现实世界纷繁杂乱。
现在基于 Scene understanding 可以产生更多的形态,例如:上图虚拟物体摔在地上分解后产生各种小碎片。要使用 Physics,只需要将 .pyhsics 加到 Scene understanding。

arView.environment.sceneUnderstanding.options.insert(.physics)


有一些细节需要我们了解:

  • ARView 中的现实世界物体是无限质量的静态物体,无法像现实生活中那样移动。
  • 上述的小碎片不断更新,不要期望物体静止不动!尤其是在非平面表面上。
  • 上图真实世界反映的网格仅限于用户已扫描的区域,例如:你没有扫描到地板,则场景中没有地板,结果物体将会掉落
  • 上述网格是真实世界的近似值,不要期望网格有超清晰的边缘
  • Physics 不支持 Collaborative Sessions

Collision

需要使用碰撞,类似前面的三个选项,只需要将 .collision 加入 scene understanding。
```

top Created with Sketch.