Build spatial experiences with RealityKit
Spatial Computing 进阶 20m

用 RealityKit 构建空间体验:Entity、RealityView 与沉浸式场景

Build spatial experiences with RealityKit

2023年6月5日

在 Apple 官方观看视频

一句话判断

RealityKit 是空间计算的 3D 核心框架,通过 Model3D(简单)和 RealityView(完整控制)两种方式为你的 SwiftUI App 添加三维内容。

这场 Session 讲了什么

John 从 RealityKit 团队出发,讲解了如何用 RealityKit 在空间计算平台上构建 3D 体验:

三种 3D 集成方式。最简单的是在 2D 窗口中嵌入 3D 内容——使用 Model3D 视图加载 USD 文件,配合 resizablescaledToFit 修饰符。更进一步是用 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 示例项目是最好的学习起点
WWDC 2023