WWDC Quick Look 💓 By SwiftGGTeam
Design immersive environments for visionOS apps and the spatial web

Design immersive environments for visionOS apps and the spatial web

观看原视频

Highlight

Apple 在 visionOS 中将沉浸式环境定义为带真实深度和视差的 3D CG 场景,开发者需要按影视级管线(前期策划、实地拍摄、后期合成)制作 14K 全景贴图 + 3D 网格资产,才能在用户转头时产生可信的 parallax 效果。

核心内容

全景图不够,深度才是灵魂

以前做 VR 背景,拍张 360 度全景图贴到球体上就算完事。用户戴上头显转头,前景和背景一起动,像在看一张巨大的壁纸。(00:30

visionOS 的系统环境(如 Haleakala)不一样。当你移动头部时,近处的岩石和远处的山脉会产生相对位移,这种视差(parallax)来自真实的 3D 深度信息。Apple 把 14K 全景图映射到带深度的 3D 网格上,骗过了人类的深度感知。(00:36

每个环境都有明确的用途

Apple 团队做环境前先问三个问题:为什么建这个环境?想呈现什么质感?用户会怎么使用这个空间?(01:24

媒体观看环境(如 Haleakala)把地形塑造成适合大屏观影的剧场感,研究最佳观看中心线。Keynote 演讲环境则刻意去掉环境音,把光照集中在舞台,帮用户专注练习公开演讲。(01:53

实地勘景是必要步骤

做真实世界环境(如 Mount Hood)前,团队会实地勘景。visionOS 用户全沉浸时视野约 81 度,但要考虑用户转身后看到什么。(02:43

Mount Hood 的原始全景里有道路和茂密植被,团队在后期把这些替换掉了。勘景时标记需要移除的元素,能节省大量后期时间。(02:57

对于无法实地到达的场景(如月球),Apple 用阿波罗任务的摄影资料做参考。参考材料能帮你验证假设、消除偏差。(03:18

详细内容

拍摄规格:14K 是底线

visionOS 环境在 40 pixels per degree 时才能达到清晰,所以 360 度全景图的理想目标是 14400 x 7200 像素。(06:53

拍摄建议:

  • 三脚架架在离地 1 米高度,保持水平,使用大景深
  • 同时架设 2 米高的副机位,同步触发拍摄,用于后期填补主视角盲区(06:19
  • 拍摄包围曝光(bracketed exposures),捕捉从太阳到阴影的大动态范围(06:45
  • 使用能覆盖全视角的设备,最终输出拼接全景图

辅助参考素材

除了主摄影,还要拍辅助素材:

  • 摄影测量(photogrammetry)和 LiDAR 产生的点云可以网格化,作为 3D 资产起点,还能测量距离(07:12
  • Macbeth 色卡、铬球(chrome sphere)、灰球(gray sphere)在同一时间拍摄,供后期 CG 资产匹配光照(07:35
  • 运动场景拍视频,用于制作可信的 shader 效果
  • 记录与运动相关的声音,供后期配空间音频

后期制作:从全景图到 3D 资产

清理阶段要移除相机支架、脚印、人物等穿帮元素。(09:04

把精修后的全景图转移到 3D 网格的 UV 空间。全景图看不到的部分用副机位素材或 CG 渲染补充。(09:55

质量控制技巧:

  • 始终做 3D 资产和全景图的 A/B 对比,确保纹理转移保真度(10:08
  • 左右翻转场景,用新鲜视角检查构图(10:23
  • 拉到极端 gamma 和 gain 值,暴露色彩不一致和纹理数据丢失(10:34

动态效果:用预计算数据替代实时光照

Bora Bora 环境有大量运动和光影交互,但实时渲染开销极高。Apple 用了一系列 trick:

云层流动:用 UV flow map 实现,成本低。对不同区域加权不同的流动速度,营造深度和规模感。(12:47

云影:跳过了实时光照渲染,改用滚动的 mask 贴图压暗地形纹理。云的运动方向和速度与上方云层匹配,产生关联感。(12:56

树叶阴影:预渲染成 flip book 纹理,叠在地形上。用预计算数据替代实时软阴影渲染。(13:15

棕榈树摆动:网格大幅简化,风力运动来自 UV flow map。树干和叶柄比小叶摆动更缓,通过层级顶点动画和分层正弦波实现。(13:43

水面效果:用多层 normal map 和滚动纹理叠加制造波浪,同时随时间调节色相、饱和度和亮度模拟阳光次表面散射。(14:06

空间音频

在环境中放置空间音频发射器(spatial audio emitter)放大沉浸感。比如把流水声绑定到河流中岩石所在的位置。(11:19

具体实现参考以下代码:

import RealityKit

func addSpatialAudio(to entity: Entity) {
    guard let waterSound = try? AudioFileResource.load(
        named: "river_flow.wav",
        configuration: .init(shouldLoop: true)
    ) else { return }

    let audioComponent = SpatialAudioComponent(
        gain: .init(linear: 1.0),
        attenuation: .init(rolloff: .physical, rolloffFactor: 5.0)
    )

    entity.components.set(audioComponent)
    entity.playAudio(waterSound)
}

关键点:

  • AudioFileResource.load 加载循环播放的音频资源
  • SpatialAudioComponent 控制增益和空间衰减,.physical rolloff 模拟真实物理衰减
  • rolloffFactor: 5.0 设置衰减距离为 5 米
  • 必须挂载到具有具体 3D 坐标的 Entity 上,挂在根节点会让声音失去方向感

加载自定义沉浸式环境

import SwiftUI
import RealityKit

struct ImmersiveEnvironmentView: View {
    @State private var immersionLevel: Double = 1.0

    var body: some View {
        RealityView { content in
            if let environment = try? await Entity(named: "Yosemite_Environment") {
                content.add(environment)
            }
        }
        .immersionStyle(selection: $immersionLevel, in: .mixed, .full)
    }
}

关键点:

  • Entity(named:) 异步加载包含 3D 网格和全景贴图的 USDZ/ RealityKit 场景资产
  • immersionStyleselection 需要 Double 类型绑定,控制混合现实和全沉浸之间的过渡
  • .mixed.full 定义了可用的沉浸模式范围

核心启发

做一个冥想 App 的沉浸式自然环境

做什么:为用户打造一片可自定义的森林或海滩环境,配合呼吸节奏调整风声和水声。

为什么值得做:session 展示了如何用 UV flow map 和分层正弦波低成本实现自然运动,小团队也能做出可信的动态环境。

怎么开始:用 Blender 渲染一张 14400x7200 的全景图和深度图,导出 USDZ,用 Entity(named:) 加载,再用 SpatialAudioComponent 把环境音绑定到具体位置。

做一个 SharePlay 虚拟观影室

做什么:多人通过 SharePlay 进入同一个虚拟影院环境,一起看电影。

为什么值得做:session 明确提到媒体观看是系统环境的核心用例之一。地形可以按影院视角 sculpted,空间音频让每个人的位置感真实。

怎么开始:设计一个带深度层次的地形网格(前排座椅、中排、远景),用 RealityKit 的 SharePlay 框架同步环境状态。

做一个实时天气变化的风景窗口

做什么:把 session 中的云层 UV flow map 和云影滚动 mask 技术用到 Widget 或 App 里,做一个会随时间变化的 3D 风景。

为什么值得做:Apple 在 Bora Bora 里展示了时间流逝系统(Jupiter 环境的需求),这套技术可以直接迁移到非全沉浸场景。

怎么开始:用 ShaderGraph 写 UV flow map 驱动云层,用滚动纹理 mask 做地面云影,配合 TimelineView 或自定义时间系统。

做一个公开演讲练习工具

做什么:参考 Keynote 环境的设计,做一个专注演讲练习的沉浸式空间,聚光灯打在”舞台”,去掉环境音。

为什么值得做:session 展示了环境设计可以服务于具体功能,不只是好看。声学设计和光学设计能引导用户注意力。

怎么开始:在 Reality Composer Pro 里布置一个舞台场景,用定向光源(Directional Light)模拟聚光灯效果,环境音设为静音,只保留用户自己的回声反馈。

做一个基于真实地点的导览 App

做什么:用摄影测量 + LiDAR 扫描真实景点,生成带深度的沉浸式导览环境。

为什么值得做:session 详细讲了实地勘景、拍摄、后期管线,小团队可以按这个流程做本地化内容。

怎么开始:用 iPhone Pro 系列的 LiDAR 扫描目标地点,用 photogrammetry 生成点云和网格,在 Blender 里精修后导出 USDZ,用 RealityKit 加载。

关联 Session

  • 279 - RealityKit — visionOS 上 RealityKit 的新特性和渲染优化,承接本 session 的 3D 资产实时渲染需求
  • 282 - Spatial Preview — 在 Xcode 中预览空间内容,调试沉浸式环境时的必备工具
  • 287 - visionOS 27 — visionOS 27 的系统级新能力,了解平台整体方向
  • 284 - 3D Models — 3D 模型在 visionOS 中的使用与优化,补充环境资产的建模知识
  • 252 - Reality Composer Pro 3 — Apple 官方 3D 内容创作工具,制作沉浸式环境的直接工具链

评论

GitHub Issues · utterances