Highlight
这场 Session 讲的是如何在 visionOS 的自定义环境里构建沉浸式媒体观看体验。以 Destination Video 示例项目的 Studio 环境为蓝本,覆盖了从基础搭建到高级效果的全流程。
核心内容
在 visionOS 上看视频,默认体验是一个可以拖动、缩放的窗口。窗口体验本身没问题,但 Apple Vision Pro 的沉浸能力远不止于此。问题在于:当你把视频放进一个自定义 3D 环境,视频画面飘在半空中,跟环境没有任何交互——看起来像一块悬浮的屏幕贴在一个房间里,观众感受不到”在这个空间里看电影”的氛围。
Apple 在 visionOS 2 里给出了系统级的解决方案。核心思路是把视频”停靠”到环境中的固定位置,再通过媒体反射、环境光照、空间混响和穿透色调这些手段,让视频和环境融为一体。具体来说,ImmersiveSpace 提供渐进式沉浸(用户通过 Digital Crown 从无沉浸调到全沉浸),AVPlayerViewController 在全屏模式下自动参与系统停靠行为。今年新增的 Docking Region 组件让你可以自定义停靠位置,把视频精确放到环境中你设计好的位置上。加上 Virtual Environment Probe 提供环境光照、Reverb 组件提供空间混响、Brightness 和 Tint 让穿透画面匹配环境色调,整套体验从”窗口贴在房间里”变成了”在影院里看巨幕”。
详细内容
基础架构:ImmersiveSpace + AVPlayerViewController
媒体观看体验的地基是 ImmersiveSpace 场景类型配合 AVPlayerViewController(02:07)。ImmersiveSpace 支持渐进式沉浸,用户通过 Digital Crown 控制沉浸程度。AVPlayerViewController 支持 HLS 流媒体,提供与系统 TV、Music 应用一致的播放控制。当 AVPlayerViewController 进入全屏模式时,系统会自动执行”停靠”——把视频画面放到一个固定位置(03:26)。
自定义停靠位置:Docking Region
默认情况下,系统决定视频停靠在哪里。今年你可以通过 Reality Composer Pro 里的 Docking Region Component 自定义这个位置(03:37)。操作步骤:在 Reality Composer Pro 的插入菜单中选择 Environment > Video Dock 预设,展开 Video Dock 实体找到 Player 实体,在 Inspector 中调整 Docking Region Component 的 width 属性。width 定义了 2.4:1 宽高比下的最大播放尺寸,超出尺寸的视频会自动缩放(06:01)。调整完宽高后,需要通过修改 Player 实体的 position transform 把画面抬高——就像影院里屏幕略高于地面一样(06:30)。
需要注意 ImmersiveSpace 的坐标原点:原点在空间首次打开时位于观众脚下附近。所有实体的位置都相对于这个原点(05:36)。Destination Video 的 Studio 环境把 Docking Region 放在观众正前方,与周围建筑对称,确保视线无遮挡(07:01)。
媒体反射:Specular 和 Diffuse
视频画面可以在环境表面产生反射,增强真实感。Reality Composer Pro 的 ShaderGraph 提供两种反射节点(08:22):
- Reflection Specular:直接反射视频内容,适用于光滑表面(金属、镜面、水面)。设置方式:场景中有 Docking Region 的实体 + 表面材质连接
Reflection_Specular节点,RealityKit 自动根据 Docking Region 位置和地面纹理坐标计算反射(08:55)。 - Reflection Diffuse:柔和衰减的反射,适用于粗糙表面(木地板、混凝土)。Studio 环境使用了 Diffuse 反射,因为柔和衰减更匹配地板材质。需要注意:如果移动了 Docking Region、地面实体或使用自定义 mesh,需要重新计算
Reflection_Diffuse的纹理坐标并导入 Reality Composer Pro(09:25)。
Virtual Environment Probe、Brightness & Tint、Reverb
Virtual Environment Probe 描述环境中的颜色变化和光照强度,系统据此自动为 PBR 材质着色,近似模拟光线在物体间的弹射(10:30)。如果你的环境支持明暗两种变体(如 Studio 的 Dark 和 Light),可以配置两个预生成的 Environment Resource 和一个 blend factor,应用代码驱动两者间的过渡,系统驱动沉浸混合。过渡时间建议短一些——系统环境的明暗过渡是 1.5 秒(11:13)。
Brightness & Tint 让穿透画面中观众手部的光照匹配自定义环境的色调,就像影院灯光变暗后手部的视觉感受(11:44)。对应代码属性是 immersiveContentBrightness 和 surroundingsEffect。
Reverb 组件 是今年新增的,在 Reality Composer Pro 的 Inspector 中通过 Add Component 添加(13:21)。预设包括 Medium Room (Treated)、Outdoor、Very Large Room 等。Studio 使用 Very Large Room 预设。即使你的环境没有自定义音频,也建议选择一个 Reverb 预设,这样系统可以用来空间化 UI 按钮等系统音效(13:46)。
Immersive Environment Picker
通过 .immersiveEnvironmentPicker 修饰符,你的自定义环境可以出现在与系统环境同一个选择列表中(14:45):
WindowGroup {
ContentView()
.immersiveEnvironmentPicker {
ForEach(viewModel.environmentItems) { item in
Button(item.title, image: item.thumbnail) {
Task {
await openImmersiveSpace(id: item.id)
}
}
}
}
}
关键点:
.immersiveEnvironmentPicker修饰符挂在ContentView()上,定义该视图内视频播放器的环境选择列表ForEach遍历环境数据,每个条目需要提供title和thumbnail图像Button的 action 中通过openImmersiveSpace(id:)打开对应的沉浸空间- 用户在系统环境列表中就能看到你的自定义环境,选择后视频自动停靠到该环境的 Docking Region
SharePlay 环境同步
SharePlay 现在可以同步环境状态,多个参与者可以共享同一种沉浸体验(15:35):
import AVKit
import GroupActivities
for await session in MyActivity.sessions() {
// join the session, activate the activity, etc.
playerViewController
.player?
.playbackCoordinator
.coordinateWithSession(session)
playerViewController
.groupExperienceCoordinator
.coordinateWithSession(session)
}
关键点:
- 导入
AVKit和GroupActivities两个框架 playbackCoordinator.coordinateWithSession(session)同步媒体播放进度,这是已有的 APIgroupExperienceCoordinator.coordinateWithSession(session)是新增的,同步观看环境状态- 两者使用同一个
GroupSession,参与者全屏观看时共享相同的环境
核心启发
-
做什么:为现有的 ImmersiveSpace 媒体应用添加 Docking Region。在 Reality Composer Pro 中给现有环境加上 Video Dock 预设,调整 Player 实体的位置和宽高,让视频从”悬浮窗口”变成”嵌入环境的固定屏幕”。为什么值得做:这是最低成本的沉浸体验升级,不需要改动代码逻辑,只在 Reality Composer Pro 里调整组件属性。怎么开始:打开现有环境的 Reality Composer Pro 项目,插入 Video Dock 预设,调整 Docking Region Component 的 width 和 Player 实体的 position。
-
做什么:给自定义环境添加 Reverb 组件和媒体反射。选择匹配环境声学特性的混响预设(如室内用 Medium Room Treated、室外用 Outdoor、大空间用 Very Large Room),并在地面材质中连接 Reflection_Diffuse 或 Reflection_Specular 节点。为什么值得做:这两个效果分别从听觉和视觉两个维度增强”在这个空间里”的真实感,且实现成本很低。怎么开始:在 Reality Composer Pro 的 Inspector 中为根实体 Add Component > Reverb,选择预设;在地面材质的 ShaderGraph 中连接反射节点。
-
做什么:实现多环境变体和 Immersive Environment Picker。为同一套环境资产准备明暗两种变体,用 Virtual Environment Probe 配置两个 Environment Resource,然后通过
.immersiveEnvironmentPicker让用户在系统环境列表中选择你的自定义环境。为什么值得做:环境变体给用户选择权,Environment Picker 让你的环境与系统环境并列展示,降低发现成本。怎么开始:参考 Destination Video 的 Studio 项目结构,它完整展示了 Dark/Light 双变体 + Environment Picker 的实现。
关联 Session
- Create custom environments for your immersive apps in visionOS — 学习如何创建自定义沉浸环境的完整流程
- Create enhanced spatial computing experiences with ARKit — ARKit 沉浸体验的进阶构建方法
- Bring your iOS or iPadOS game to visionOS — 将现有 iOS 游戏迁移到 visionOS 沉浸空间的实践
- Design interactive experiences for visionOS — visionOS 交互叙事体验的设计方法论
评论
GitHub Issues · utterances