Explore USD tools and rendering
System & Services 进阶 20m

USD 工具与渲染

Explore USD tools and rendering

2022年6月6日

在 Apple 官方观看视频

一句话判断

Apple 在 macOS 13 里给 USD 套了一整套工具链——从 USDZ Validate 校验工具到 Reality Composer Pro 编辑器再到 ARKit 的 USD 渲染管线,做 3D/AR 的开发者终于不用在 Blender 和 Xcode 之间反复横跳了。

这场 Session 讲了什么

这场 Session 是 “Understand USD fundamentals”(10129)的姊妹篇,聚焦在 Apple 平台上实际使用 USD 的工具和渲染管线。如果你已经理解了 USD 的基本概念(Prim、Layer、Composition),这场 Session 告诉你用什么工具来创建、编辑和渲染 USD 内容。

Reality Composer Pro。 这是 Xcode 14 新增的 3D 场景编辑器,用来替代之前的 Reality Composer。它直接编辑 USDA/USDC 文件,支持可视化拖拽编辑场景层级、添加和修改材质、设置灯光和相机。关键改进是它和 Xcode 的深度集成——你在 Reality Composer Pro 里做的修改会直接反映到 Xcode 项目中,不需要手动导出/导入。

USDZ Validate。 这是一个命令行工具(usdzcheck),用来验证 USDZ 文件是否符合 Apple 的规范。它检查:文件结构是否正确、纹理格式是否受支持、polycount 是否合理、层级结构是否符合要求。如果你的 USDZ 文件通过了验证,它就能在所有 Apple 平台(iOS、macOS、watchOS)上正确加载和渲染。

USDZ Convert。 如果你有其他格式的 3D 模型(OBJ、FBX、GLTF),可以用 usdzconvert 工具转换成 USDZ 格式。这个工具在 Xcode 的命令行工具包里。转换时会尝试保留材质、纹理和动画数据,但不是所有源格式特性都能无损转换。

ARKit 的 USD 渲染管线。 ARKit 2 引入了基于 USD 的 scene reconstruction。当用户用 LiDAR 扫描环境时,ARKit 会生成一个 USD 格式的 3D mesh。这个 mesh 可以在 RealityKit 里直接加载和渲染。Session 里演示了如何获取扫描数据并用 RealityKit 显示。

材质系统。 Apple 的 USD 实现使用了 UsdPreviewSurface 作为标准材质——这是一个 USD 规范里定义的基础 PBR 材质,支持 diffuseColor、metallic、roughness、normal 等属性。RealityKit 在渲染时会自动把 UsdPreviewSurface 转换成自己的材质系统。

Quick Look 和 AR Quick Look。 Safari 和邮件等 App 支持 USDZ 文件的 Quick Look 预览。用户点击一个 USDZ 链接,可以直接在 3D 预览中旋转查看,或者切换到 AR 模式把模型放到现实环境中。你的 App 也可以通过 QLPreviewController 集成这个能力。

值得深挖的点

USDZ 的性能限制。 USDZ 文件的渲染性能取决于多个因素:polycount(面数)、纹理分辨率、材质复杂度。Apple 建议移动端(iPhone/iPad)的模型面数控制在 100 万以下,纹理分辨率不超过 2048x2048。如果模型太复杂,RealityKit 会自动降级渲染(减少面数、降低纹理精度),但效果可能不理想。用 usdzcheck 检查模型时,它会给出性能预估。

MaterialX 和 UsdPreviewSurface 的关系。 Apple 目前主要使用 UsdPreviewSurface 作为材质标准。但 USD 规范也在支持 MaterialX——一个更强大的材质描述格式。未来 Apple 可能会在 RealityKit 中支持 MaterialX 材质,但目前如果你的模型需要复杂材质效果(比如次表面散射、各向异性反射),需要在 App 内用 RealityKit 的自定义材质 API 手动实现。

代码片段

使用 USDZ Validate 检查模型:

# 检查 USDZ 文件是否合规
xcrun usdzcheck MyModel.usdz

# 输出示例:
# Checking MyModel.usdz...
# - File structure: OK
# - Texture formats: OK (2 PNG, 1 JPEG)
# - Triangle count: 45,230 (within limit)
# - Texture resolution: max 1024x1024 (within limit)
# - Material validation: OK
# PASSED

# 如果有问题会列出具体错误:
# ERROR: Texture "env_map.exr" uses unsupported format (HDR)
# WARNING: Triangle count exceeds recommended limit (1,500,000)

从 OBJ 转换到 USDZ:

# 基本转换
xcrun usdzconvert model.obj -o model.usdz

# 带参数转换
xcrun usdzconvert model.obj \
    -o model.usdz \
    -color_map diffuse.png \
    -normal_map normal.png \
    -metallic_map metallic.png \
    -roughness_map roughness.png \
    -embed_textures \
    -mesh_compression high

在 RealityKit 中加载和自定义 USDZ 模型:

import RealityKit

// 加载 USDZ 模型
let entity = try Entity.load(named: "MyModel.usdz")

// 修改材质
if let model = entity.findEntity(named: "Body") as? ModelEntity {
    var material = SimpleMaterial()
    material.color = .init(tint: .blue, texture: nil)
    material.metallic = 0.8
    material.roughness = 0.2
    model.model?.materials = [material]
}

// 添加动画
let animation = try AnimationResource.generateRotate(
    axis: [0, 1, 0],
    angle: .pi * 2,
    duration: 5,
    repeatMode: .repeat
)
entity.playAnimation(animation)

// 添加到场景
let anchor = AnchorEntity(world: [0, 0, -1])
anchor.addChild(entity)
arView.scene.anchors.append(anchor)

在网页中嵌入 AR Quick Look:

<a href="MyModel.usdz" rel="ar">
    <img src="model-preview.jpg" alt="3D 模型预览">
    <p>点击在 AR 中查看</p>
</a>

最佳实践

每次修改 USDZ 模型后都跑一遍 usdzcheck。这个工具会检查格式合规性和性能问题,帮你提前发现可能导致加载失败或渲染卡顿的问题。把它集成到 CI 管线里也是个好主意。

纹理使用 Power-of-Two 分辨率(256、512、1024、2048)。RealityKit 的纹理管线对 POT 分辨率优化得更好。非 POT 纹理加载时会被自动缩放,可能影响质量。

模型层级要和交互需求匹配。如果用户需要单独操控模型的某个部分(比如旋转车轮),确保那个部分在 USD 里是一个独立的 Prim,而不是和其他几何体合并在同一个 mesh 里。RealityKit 的 entity 层级会直接反映 USD 的 Prim 层级。

还有什么值得关注

  • Reality Composer Pro 支持 USD 的 variant 功能——你可以在同一个文件里定义多个模型变体(比如不同颜色的椅子),在 RealityKit 里通过 entity.setVariant() 切换。
  • usdzconvert 支持从 Xcode 的 SceneKit 场景文件(.scn)转换到 USDZ,方便迁移旧的 SceneKit 项目。
  • macOS 13 的 Finder 支持直接预览 USDZ 文件(空格键 Quick Look),不需要打开任何 App。
  • AR Quick Look 支持自定义行为——你的网页可以通过 JavaScript 监听用户在 AR Quick Look 里的操作(比如截图、返回网页)。
WWDC 2022