USD 工具与渲染
Explore USD tools and rendering
2022年6月6日
一句话判断
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 里的操作(比如截图、返回网页)。