# USD 工具集核心命令与场景化工作流解析:usdstitch、usdcat --flatten 与 usdstitchclips
## 摘要
本文基于 Universal Scene Description (USD) 22.08 版本文档,解析了 `usdstitch`、`usdcat --flatten` 及 `usdstitchclips` 在处理多层级文件合并时的本质区别。重点阐述了它们在处理 Composition Arcs(组合弧)和时间采样数据(TimeSamples)上的不同机制,并明确了在动画序列场景下选择 `usdstitchclips` 的适用条件。
## 核心命令的本质区别:保留组合弧 vs. 扁平化评估
在 USD 22.08 的工具集中,处理多个文件合并时,`usdstitch` 与 `usdcat --flatten` 的核心差异在于对“组合算子”(Composition Operators)的处理方式。
`usdstitch` 的设计目标是创建一个时间维度的合并结果。它将输入文件序列视为完整场景的时间切片进行融合。关键特性是:**结果文件将包含输入文件中所有原生的 Composition Arcs 的有序并集**。这意味着,如果输入文件之间存在引用(References)、子层(SubLayers)或其他组合弧,`usdstitch` 会保留这些结构关系,而不是将其展开或评估。
相比之下,`usdcat --flatten` 的行为是“烘焙”(Bake)。它使用 `UsdStage::Export()` 机制,在输出时同时移除所有组合算子本身。无论是命名空间算子(如引用、子层)还是值解析算子(如层偏移),都会被评估并展开。虽然扁平化后的数据在结构上可能与源文件不同,但其计算和评估行为应与源文件保持一致。
## 时间采样数据的处理机制:合并 vs. 保留最强层
在处理包含时间采样(TimeSamples)的数据时,两个命令表现出截然不同的逻辑,这直接影响动画数据的完整性。
`usdstitch` 会**合并**输入文件序列中的所有 `timeSamples`。其逻辑类似于将每个文件视为时间轴的一部分进行拼接。如果不同文件中存在相同的时间键冲突,则遵循层强度规则(Opinion strength),即顺序靠前的文件具有更高优先级,但这仅适用于非时间采样数据;对于时间采样本身,它们是作为并集处理的。
而 `usdcat --flatten` 在保留时间采样方面更为保守。它**只保留包含时间采样的最强层(Strongest Layer)中的 TimeSamples**。这与 USD 阶段中值解析(Value Resolution)对分层时间采样的解释方式一致。如果某个属性在多个层上有定义,且只有部分层包含时间采样数据,扁平化操作将丢弃较弱层上的时间采样信息。
## 何时选择 usdstitchclips:动画序列的专用工具
当输入文件构成一个连续的动画序列时,简单的扁平化或普通合并往往无法正确表达动画逻辑。此时应使用 `usdstitchclips`。
`usdstitchclips` 利用 Value Clips(值剪辑)功能,专门用于处理由一系列 USD 文件组成的顺序动画。它假设输入文件按时间顺序排列,并根据每个文件的 `startTimeCode` 和 `endTimeCode` 元数据确定其激活范围。
该工具生成两个关键文件:
1. **result.topology.usd**:包含所有输入文件中原型的联合拓扑结构和元数据。
2. **result.usd**:仅包含必要的原型层级,并在指定路径(CLIPPATH)下托管 Value Clips 元数据。此文件适合作为子层堆栈的根层,通过引用指向 topology 文件来加载动画内容。
`usdstitchclips` 特别适用于以下场景:
- 输入文件仅包含默认值时,普通合并不会产生动画,而 `usdstitchclips` 能正确识别时间采样以生成动画。
- 需要精确控制剪辑的激活范围(通过 `--templateMetadata`、`--stride` 和 `--activeOffset` 参数),例如根据文件名中的帧号模板自动解析文件序列。
## 总结
在 USD 22.08 的工作流中,选择哪个工具取决于对场景结构完整性和时间数据的需求。若需保留复杂的组合层级结构并合并所有时间数据,使用 `usdstitch`;若仅需查看最终评估结果或简化层级,使用 `usdcat --flatten`;若处理的是明确的动画序列文件集,则必须使用 `usdstitchclips` 以利用 Value Clips 机制正确驱动时间轴。