用 RealityKit 构建空间体验:Entity、RealityView 与沉浸式场景
Build spatial experiences with RealityKit
2023年6月5日
一句话判断
RealityKit 是空间计算的 3D 核心框架,通过 Model3D(简单)和 RealityView(完整控制)两种方式为你的 SwiftUI App 添加三维内容。
这场 Session 讲了什么
John 从 RealityKit 团队出发,讲解了如何用 RealityKit 在空间计算平台上构建 3D 体验:
三种 3D 集成方式。最简单的是在 2D 窗口中嵌入 3D 内容——使用 Model3D 视图加载 USD 文件,配合 resizable 和 scaledToFit 修饰符。更进一步是用 volumetric window(体积窗口),它为 3D 模型提供独立的窗口空间,支持从任意角度查看,且保持真实尺寸。最沉浸的是 Immersive Space(沉浸空间),允许 App 在空间中任意位置放置 3D 元素。
Entity-Component 架构。Entity 是容器对象,本身不做什么;给它添加 Component 才能赋予行为。比如 ModelComponent 让它渲染、HoverEffectComponent 添加悬停效果、AudioComponent 添加空间音频。系统预置了多种 Component,你也可以创建自定义 Component。
RealityView。这是 SwiftUI 中的 3D 视图容器。创建时可以添加初始 Entity,更新时可以响应 SwiftUI 状态变化修改 Entity。RealityView 让你能完全控制 3D 场景的构建。
交互、动画和音频。空间计算平台支持注视和手势输入,RealityKit 提供了手势处理 API。动画系统支持 Entity 的变换动画,空间音频让声音具有三维定位感。
值得深挖的点
Volumetric Window 的固定尺寸。体积窗口有一个以米为单位的固定大小。你在里面放一个 1 米宽的模型,它在任何情况下都会显示为 1 米。这是”真实尺寸”的承诺——和 AR 中的真实物体一样大。
Immersive Space 的沉浸等级。有不同级别的沉浸:混合模式(Mixed Immersion)在真实环境中叠加 3D 内容,保持用户对周围环境的感知;完全沉浸(Full Immersion)则隐藏穿透视图,显示自定义背景。“Go beyond the window with SwiftUI” Session 详细讲解了这些模式。
自定义 Component 和 System。RealityKit 的 ECS(Entity-Component-System)架构允许你定义自己的 Component 来存储自定义数据,定义自己的 System 来每帧更新这些数据。这是构建复杂交互行为的基础。
代码片段
// 最简单:在 SwiftUI 中嵌入 3D 模型
import RealityKit
Model3D(named: "Globe") { model in
model
.resizable()
.scaledToFit()
} placeholder: {
ProgressView() // 异步加载时显示进度
}
// 体积窗口:在 App 中定义 volumetric window
@main
struct WorldApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
// 为地球模型添加独立的体积窗口
WindowGroup(id: "globe") {
GlobeView()
}
.windowStyle(.volumetric)
.defaultSize(width: 0.5, height: 0.5, depth: 0.5, in: .meters)
}
}
// 打开体积窗口
struct ContentView: View {
@Environment(\.openWindow) var openWindow
var body: some View {
Button("查看地球") {
openWindow(id: "globe")
}
}
}
// RealityView:完全控制 3D 场景
RealityView { content in
// 初始设置
let earth = try await Entity(named: "Earth")
earth.position = SIMD3(0, 0, -1)
content.add(earth)
} update: { content in
// 响应 SwiftUI 状态变化
// 可以在这里更新 Entity 的属性
}
最佳实践
- 简单的 3D 展示用
Model3D,需要交互和自定义行为用RealityView。 - 体积窗口适合需要从多角度查看的 3D 模型(如地球、产品展示)。
- 沉浸空间适合需要空间感的体验(如太阳系、游戏场景),但要考虑用户的安全和舒适度。
- 利用 Reality Composer Pro 预览和编辑 3D 内容,减少在代码中调整的次数。
- 使用空间音频增强沉浸感,声音的方向和距离让 3D 体验更真实。
还有什么值得关注
- “Meet SwiftUI for spatial computing” 是前置知识
- “Take SwiftUI to the next dimension” 讲了更多窗口中 3D 内容的展示技巧
- “Go beyond the window with SwiftUI” 详细讲解沉浸空间的各种模式
- “Meet Reality Composer Pro” 介绍了 3D 内容编辑工具
- Hello World 示例项目是最好的学习起点