RealityKit 是Apple 在 WWDC2019 推出的增强现实应用开发框架,是一个包含了虚拟对象渲染、动画、物理、音频等功能的3D引擎,配合 LiDAR 扫描仪和 ARKit 的场景理解能力,开发者可以更轻松地创造高质量的增强现实体验。除了用于渲染 3D 内容的 RealityKit 之外,Apple 还提供了配套的 3D 内容生产工具:Reality Converter 和 Reality Composer,并以 USDZ 3D文件格式为中介,串联起增强现实应用的内容生产工作流程。
RealityKit 中所有的虚拟对象都继承自 Entity
,其中默认包含了Transform
和Synchronization
信息:
无论是通过 USDZ 文件格式还是通过 Reality Composer 导入到项目的 3D 文件,在 RealityKit 中都是通过 Entity
的树形层级结构来存储的。
Anchor Entity 用于表示 AR 场景中的坐标信息,既可以是用于锚定对象的空坐标,也可以是实现 HasAnchoring
协议的 Model Entity。不过更常用的两种方式是作为 Raycast 或平面检测结果的载体:
1. 从 Raycast 返回的空间坐标生成 Anchor,例如将屏幕点击的位置转换成 AR 世界坐标:
let touchLocation = sender.location(in: arView)
guard let raycastResult = arView.raycast(from: touchLocation, allowing: .estimatedPlane, alignment: .any).first else {
messageLabel.displayMessage("No surface detected, try getting closer.", duration: 2.0)
return
}
let anchor = AnchorEntity(raycastResult: raycastResult)
anchor.addChild(entity)
arView.scene.addChild(anchor)
2. 用于平面检测,过滤符合面积要求的平面坐标,例如选定游戏场景所在平面:
// 返回检测到的 **水平** 且 面积不小于 20x20 cm 的平面坐标
let anchor = AnchorEntity(plane:.horizontal, minimumBounds: [0.2,0.2])
anchor.addChild(model)
arView.scene.addAnchor(anchor)
ModelEntity
RealityKit 实际渲染的虚拟对象存储在 Model Enityt 中的 ModelComponent
中;Model Entity 中也可以定义对象的碰撞属性、物理属性、物理运动等。
一个虚拟对象的视觉部分由 Mesh 和 Material 组成,前者定义对象的几何形状,后者定义纹理材质。RealityKit 支持 4 种基本几何形状,意味着可以在程序运行过程中生成(同时也意味着除此之外的复杂形状需要从其它建模工具中产生):
.generateBox
.generatePlane
.generateSpere
.generateText
RealityKit 支持 4 种基本材质:
SimpleMaterial
:基本材质,能够根据材质属性(金属、粗糙等)反射环境、虚拟光源;
UnlitMaterial
:不反射光线的基本材质;
VideoMaterial
:将视频素材作为材质,例如虚拟播放器/小电视;
OcclusionMaterial
:遮挡素材,可以造成遮挡效果:
由于 RealityKit 目前只支持少量基本几何形状,更复杂的虚拟场景仍然需要通过其他专业 3D 建模工具生成。接下来以 Blender 为例,说明从建模到实现 AR 效果的开发过程。
在 Blender 中完成模型、贴图、动画等设计后,可以导出 3D 文件(其中兼容性最好的是glTF 2.0
格式),然后通过 Reality Converter 转换为 USDZ 文件(也可以利用 Blender 插件,直接导出到 .usd
文件,其原理是一样的)。
在 Reality Converter 中可以对 3D 对象的材质等属性进行简单修改:
从 Reality Converter 导出的 USDZ 文件可以直接导入到 Reality Composer 中:
在 Composer 中可以重新编辑对象的物理属性、空间坐标、动画效果等,但更重要的是明确不同对象的分组、层级关系,因为在 RealityKit 中很有可能需要分别独立或成组地访问这些资源;在实际 AR 场景中的坐标关系也是在当前资源相对位置关系的基础上重新定义的。
Composer 导出的 .rcproject
文件可以直接导入到 Xcode ,并可以在 Swift
中直接通过文件名访问:
let scene = try! RocketLaunch.loadTower()
有时候需要在代码中对导入的资源进行重新调整,例如给导入的几何形状替换遮挡材质:
let coverGround = rocketScene!.findEntity(named: "LaunchRocket_Ground")?.findEntity(named: "Ground")
var component: ModelComponent = coverGround?.components[ModelComponent].self as! ModelComponent
component.materials = [OcclusionMaterial()]
coverGround?.components.set(component)
RealityKit 只有两年时间,目前仍有很多不足之处,希望在后续版本中可以得到改进:
基本形状太少
粒子系统欠缺
动画支持不足
USDZ 生态
首先是基本几何形状支持太少,有人吐槽 RealityKit 的 LOGO 中,只有一个球形(Sphere)是原生支持的。
其次是缺少对粒子系统的支持,这就意味着无法支持酷炫的特效,就像 SceneKit 的 SCNParticleSystem
一样。
虽然 Composer 支持一些 PPT 级别的行为/动画效果,但是对于从其它工具导出到 Converter 再导出到 Composer 的工作流程来说,对于动画的兼容性仍然很有限。
对于拥有强大号召力的 Apple 来说,采用自己的 USDZ 格式并不令人意外,整个生态对USDZ 的支持也不必担心,只不过其先天限制可能需要你事先了解,已决定是否符合自己的项目需要,具体可以参考:《glTF and USDZ》。
Apple 对于 AR 软硬件生态的布局已经逐渐清晰,RealityKit 作为虚拟渲染引擎,与 ARKit 的配合更加紧密,前者负责渲染增强实体,后者负责理解现实场景:
但是从目前 RealityKit 的设计来看,它当下的目标并非覆盖所有 AR 应用场景(或者说不具备这个能力),而是紧密配合硬件的适用范围(如 LiDAR 支持 5m 内的激光扫描),针对小场景、客厅级AR 应用,提供了一整套稳健、快速的生产解决方案。
RealityKit | Apple Developer Document
Getting started with RealityKit
WWDC20: What's new in ARKit and RealityKit?
WWDC19 Session 603 - Introducing RealityKit and Reality Composer
WWDC19 Session 605 - Building Apps with RealityKit
WWDC20 Session 10612 - What's new in RealityKit