Blender →
*.gltf
→ Converter →*.usdz
→ Composer →*.rcproject
→ RealityKit / ARKitmarkdown
🔗 原文连接 app
RealityKit 是Apple 在 WWDC2019 推出的加强现实应用开发框架,是一个包含了虚拟对象渲染、动画、物理、音频等功能的3D引擎,配合 LiDAR 扫描仪和 ARKit 的场景理解能力,开发者能够更轻松地创造高质量的加强现实体验。除了用于渲染 3D 内容的 RealityKit 以外,Apple 还提供了配套的 3D 内容生产工具:Reality Converter 和 Reality Composer,并以 USDZ 3D文件格式为中介,串联起加强现实应用的内容生产工做流程。框架
RealityKit 中全部的虚拟对象都继承自 Entity
,其中默认包含了Transform
和Synchronization
信息:ide
不管是经过 USDZ 文件格式仍是经过 Reality Composer 导入到项目的 3D 文件,在 RealityKit 中都是经过 Entity
的树形结层级构来存储的。工具
Anchor Entity 用于表示 AR 场景中的坐标信息,既能够是用于锚定对象的空坐标,也能够是实现 HasAnchoring
协议的 Model Entity。不过更经常使用的两种方式是做为 Raycast 或平面检测结果的载体:oop
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)
复制代码
RealityKit 实际渲染的虚拟对象存储在 Model Enityt 中的
ModelComponent
中;Model Entity 中也能够定义对象的碰撞属性、物理属性、物理运动等。动画
一个虚拟对象的视觉部分由 Mesh 和 Material 组成,前者定义对象的几何形状,后者定义纹理材质。RealityKit 支持 4 种基本几何形状,意味着能够在程序运行过程当中生成(同时也意味着除此以外的复杂形状须要从其它建模工具中产生):ui
.generateBox
spa
.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 只有两年时间,目前仍有不少不足之处,但愿在后续版本中能够获得改进:
首先是基本几何形状支持太少,有人吐槽 RealityKit 的 LOGO 中,只有一个球形(Sphere)是原生支持的。
其次是缺乏对粒子系统的支持,这就意味着没法支持酷炫的特效,就像 SceneKit 的 SCNParticleSystem
同样。
虽然 Composer 支持一些 PPT 级别的行为/动画效果,可是对于从其它工具导出到 Converter 再导出到 Composer 的工做流程来讲,对于动画的兼容性仍然颇有限。
对于拥有强大号召力的 Apple 来讲,采用本身的 USDZ 格式并不使人意外,整个生态对USDZ 的支持也没必要担忧,只不过其先天限制可能须要你事先了解,已决定是否符合本身的项目须要,具体能够参考:《glTF and USDZ》。
Apple 对于 AR 软硬件生态的布局已经逐渐清晰,RealityKit 做为虚拟渲染引擎,与 ARKit 的配合更加紧密,前者负责渲染加强实体,后者负责理解现实场景:
可是从目前 RealityKit 的设计来看,它当下的目标并不是覆盖全部 AR 应用场景(或者说不具有这个能力),而是紧密配合硬件的适用范围(如 LiDAR 支持 5m 内的激光扫描),针对小场景、客厅级AR 应用,提供了一整套稳健、快速的生产解决方案。