What's new in USD
Augmented Reality 进阶 20m

USD 新特性

What's new in USD

2020年6月25日

在 Apple 官方观看视频

一句话判断

如果你在 AR/3D 内容管线中工作,了解 USD 格式的最新进展很重要——Apple 正在全力推动它成为 AR 内容的标准格式。

这场 Session 讲了什么

这场 Session 介绍了 USD(Universal Scene Description)格式在 Apple 生态中的最新进展。USD 是 Pixar 开发的开源 3D 场景描述格式,Apple 将其精简版本 USDZ 作为 AR 内容的标准格式。2020 年的更新扩展了 USDZ 格式的能力边界。

演讲者首先回顾了 USD 的基本概念——它不像传统的 3D 文件格式(如 OBJ、FBX)那样只存储静态几何数据,而是一个完整的场景描述系统,支持层级结构、组合(Composition)、动画、材质和自定义属性。USDZ 是 USD 的一个受限子集,专门为移动端实时渲染优化。

Session 的核心内容是 USDZ 在 2020 年新增支持的特性:骨骼动画(Skeletal Animation)——允许在 USDZ 中存储带骨骼的角色动画;空间音频(Spatial Audio)——可以在 3D 场景中定义音频源的位置;以及改进的材质系统——支持更多的 PBR 材质属性。

演讲者还介绍了 Apple 提供的 USD 工具链更新,包括 Reality Converter 的增强(更好的预览和转换质量)和 command-line tools 的更新(如 usdzconvert 的新参数)。

值得深挖的点

  • 骨骼动画在 USDZ 中的实现:USDZ 的骨骼动画支持意味着你可以在一个文件中同时包含角色模型和动画数据,ARKit/RealityKit 可以直接播放,不需要额外的动画文件。这简化了 AR 角色应用的开发流程——建模师在 Maya/Blender 中导出一次就够了。
  • USD 的 Composition Arc 机制:USD 最强大的特性之一是 Composition——你可以将多个 USD 文件通过引用(reference)、子层(sublayer)、变体(variant)等方式组合成一个完整场景。这对大型 3D 项目的协作非常有价值。

代码片段

# 使用 usdzconvert 将 Maya/FBX 文件转换为 USDZ
usdzconvert \
  --input model.fbx \
  --output model.usdz \
  --export-skeleton \
  --export-skin \
  --export-blendshapes \
  --loop-time 2.0

# 转换带骨骼动画的模型
usdzconvert \
  --input character_with_anim.fbx \
  --output character.usdz \
  --export-animation \
  --animation-time-range 0,60
// 在 RealityKit 中加载带骨骼动画的 USDZ
import RealityKit

func loadSkinnedCharacter() {
    let entity = try! Entity.load(named: "character_usdz")

    // 枚举所有可用的动画
    for animation in entity.availableAnimations {
        print("动画名称: \(animation.name)")
        print("持续时间: \(animation.duration) 秒")
    }

    // 播放第一个动画
    if let walk = entity.availableAnimations.first {
        entity.playAnimation(walk.repeat())
    }

    let anchor = AnchorEntity(world: [0, 0, -2])
    anchor.addChild(entity)
    arView.scene.anchors.append(anchor)
}
# 使用 Python USD 库检查 USDZ 文件内容
from pxr import Usd, UsdGeom

stage = Usd.Stage.Open("model.usdz")

# 遍历场景层级
for prim in stage.Traverse():
    print(f"Prim: {prim.GetPath()}")
    if prim.IsA(UsdGeom.Mesh):
        mesh = UsdGeom.Mesh(prim)
        points = mesh.GetPointsAttr().Get()
        print(f"  顶点数: {len(points)}")

最佳实践

  • 3D 模型导出前在 Reality Converter 中预览,确认材质和动画在 Apple 生态中表现正确
  • 骨骼动画的骨骼数量和蒙皮权重不要过多,移动端实时性能有限
  • 纹理使用 ASTC 压缩格式,在质量和大小之间取得平衡
  • USDZ 文件大小控制在 10MB 以内,确保快速加载
  • 复杂场景使用 USD 的 Composition 机制拆分管理,避免单个文件过大

还有什么值得关注

  • USD 格式在工业界(影视、游戏、CAD)的采用率正在快速增长,Pixar、NVIDIA、Apple 是主要推动者
  • Apple 的 arkit-python 工具可以在 Python 中生成 USDZ 文件,适合自动化管线
  • 搭配 “Explore ARKit 4” 和 “What’s new in RealityKit” 一起看,理解完整的 AR 内容管线
WWDC 2020