用 RealityKit 增强你的空间计算 app
Enhance your spatial computing app with RealityKit
2023年6月5日
一句话判断
RealityKit 在空间计算平台上加入了 Attachment、VideoPlayer、Portal 和粒子系统,能做的事远超你想象。
这场 Session 讲了什么
RealityKit 在空间计算平台上获得了大量新功能。Session 以一个太阳系探索 app 为例,逐步展示了这些新特性的使用方式。
RealityView Attachment 允许你将 SwiftUI 视图嵌入到 RealityKit 场景中。通过 attachments view builder 提供视图,在 make closure 中通过 entity(for:) 获取对应的实体,然后像添加普通实体一样将其放置在场景中。
VideoPlayerComponent 是一个全新的组件类型,用于在 3D 场景中嵌入视频播放。它自动根据视频宽高比生成矩形 mesh,支持所有 AVFoundation 支持的格式,包括 2D 视频和 3D MV-HEVC 视频。视频默认 1 米高,通过缩放实体调整大小。
Portal(传送门)可以打开一扇通往另一个世界的窗户。Particle Emitter API 为场景添加视觉特效。Anchor 功能将 3D 内容附着到现实世界的位置(如墙面)。
值得深挖的点
Attachment 的数据流设计值得注意。SwiftUI 视图在 attachments view builder 中声明,带上 tag 标识符。然后在 RealityView 的 make/update closure 中,通过 entity(for:) 获取对应的 ViewAttachmentEntity 实体。update closure 在 SwiftUI 视图状态变化时被调用,允许你动态更新实体。
VideoPlayerComponent 的 mesh 自动生成行为与 SwiftUI 的 VideoPlayer 和 Core Animation 的 AVPlayerLayer 类似。但因为 RealityKit 是 3D 框架,视频以带有 mesh 的实体形式存在,可以在 3D 空间中自由移动和定位。
代码片段
// Attachment - 将 SwiftUI 视图嵌入 3D 场景
RealityView { content, attachments in
let earthEntity = try await Entity(named: "Earth")
content.add(earthEntity)
if let label = attachments.entity(for: "earth_label") {
earthEntity.addChild(label)
label.position = [0, -0.2, 0]
}
} attachments: {
Text("地球")
.tag("earth_label")
}
// VideoPlayerComponent - 3D 场景中的视频播放
let player = AVPlayer()
let videoComponent = VideoPlayerComponent(avPlayer: player)
entity.components.set(videoComponent)
entity.scale *= 0.4 // 缩放到 40 厘米高
player.currentItem = AVPlayerItem(url: videoURL)
player.play()
最佳实践
- 使用 Attachment 为 3D 内容添加标签和说明
- VideoPlayerComponent 默认高度 1 米,记得缩放到合适大小
- 使用 glassBackgroundEffect 为 Attachment 添加毛玻璃背景
- Portal 适合创建通往另一个沉浸式世界的入口
- 利用 fromToByAnimation 为视频实体添加淡入效果
还有什么值得关注
- 参考 “Build spatial experiences with RealityKit” 了解基础概念
- “Work with Reality Composer Pro content in Xcode” 提供更详细的 Attachment 用法
- “Deliver video content for spatial experiences” 讲解 3D 视频内容制作
- Anchor 可以将 3D 内容附着到现实世界的墙面等位置