Get started with building apps for spatial computing
Spatial Computing 进阶 20m

空间计算应用开发入门

Get started with building apps for spatial computing

2023年6月5日

在 Apple 官方观看视频

一句话判断

这是 visionOS 开发的入门必修课——Shared Space、Windows、Volumes、Full Space 四个概念的差异,RealityKit + ARKit + SwiftUI 三层架构的分工,以及从现有 iOS App 迁移的三种路径。

这场 Session 讲了什么

Session 从基础概念开始,逐步介绍了 visionOS App 的开发方式。

基础概念。默认情况下 App 启动到 Shared Space——多个 App 并排存在,类似 Mac 桌面。每个 App 可以有一个或多个窗口(Window),这些是 SwiftUI 的 Scene,支持调整大小和重排布局,可以混合 2D 和 3D 内容。Volumes 是在 Shared Space 中展示 3D 内容的固定边界容器(比如棋盘),用户可以从不同角度查看。Full Space 模式下,App 独占整个空间,适合沉浸式体验。

技术栈。SwiftUI 构建 UI 窗口和控件。RealityKit 渲染 3D 内容、处理空间音频和物理模拟。ARKit 提供空间感知能力(平面检测、图像追踪、世界映射)。三层协同工作,SDK 提供了统一的 API 接口。

三种起步方式。最简单的是让现有 iPad/iOS App 以兼容模式运行——无需修改代码,获得类似 iPad 的窗口体验。进一步是用 visionOS SDK 重新编译现有 App,获得原生渲染和交互。最完整的是创建全新的 visionOS App,充分利用 3D 和空间能力。

值得深挖的点

Shared Space vs Full Space 的选择:大多数日常应用适合 Shared Space——用户可以同时看到你的 App 和其他 App。Full Space 适合游戏、冥想、沉浸式媒体等需要完全占据用户注意力的体验。你的 App 可以在不同模式之间切换。

Volumes 的定位:Volumes 是 3D 内容在 Shared Space 中的”容器”。它们有明确的边界,不与其他 App 的内容重叠。如果你的 App 只需要展示一个 3D 模型(比如商品预览),Volumes 是最佳选择。

RealityView:这是 SwiftUI 中嵌入 RealityKit 内容的关键组件。它在 SwiftUI 视图层级中创建一个 3D 渲染区域,你可以向其中添加实体、设置材质和光照。

代码片段

创建一个包含 3D 内容的 visionOS 窗口:

import SwiftUI
import RealityKit

struct ContentView: View {
    var body: some View {
        // RealityView 是 SwiftUI 和 RealityKit 的桥梁
        RealityView { content in
            // 创建一个 3D 模型实体
            let model = ModelEntity(
                mesh: .generateSphere(radius: 0.1),
                materials: [SimpleMaterial(color: .blue, isMetallic: true)]
            )
            // 添加手势支持
            model.generateCollisionShapes(recursive: true)
            content.add(model)
        }
        .gesture(
            SpatialTapGesture()
                .targetedToAnyEntity()
                .onEnded { value in
                    // 用户点击了 3D 对象
                    let entity = value.entity
                    // 添加动画效果
                }
        )
    }
}

App 入口配置:

@main
struct MyApp: App {
    var body: some Scene {
        // 窗口场景 — 在 Shared Space 中展示
        WindowGroup {
            ContentView()
        }

        // 或者使用 Volume 展示 3D 内容
        // Volume {
        //     Model3DView()
        // }
    }
}

最佳实践

  • 先以兼容模式运行现有 iOS App 验证基本功能,再逐步原生化
  • 日常应用用 Shared Space + Window 模式,游戏和沉浸内容用 Full Space
  • 用 RealityView 在 SwiftUI 中嵌入 3D 内容,保持声明式 UI 的编程模型
  • 为 3D 对象添加碰撞形状(collision shapes)才能接收手势事件
  • 窗口内容不要过于拥挤——空间环境需要留白

还有什么值得关注

  • ARKit 的空间感知能力在 visionOS 上的具体 API
  • 从 Full Space 退回 Shared Space 的用户交互设计
  • 3D 手势(DragGesture、RotateGesture)在空间环境中的使用
  • visionOS App 的性能预算和渲染限制
WWDC 2023