Composer是NVIDIA Omniverse中用于场景编排与协作的工具,负责加载USD资产、设置基础变换与可见性、通过脚本驱动状态切换,并导出时间采样数据,但不提供时间轴编辑或关键帧插值功能。

Composer 不是动画工具,也没有“关键帧”或“分步装配指导动画”功能。你看到的这类效果,通常由 Unity、Blender、WebGL(如 Three.js)或专用工业 AR/VR 软件实现,不是 Composer 的职责范围。
Composer 是什么,它负责哪部分
Composer 是 NVIDIA Omniverse 中用于**场景编排与协作**的工具,核心能力是:
- 加载、排列、引用多个 USD(Universal Scene Description)资产
- 设置基础变换(
translate、rotate、scale)和可见性(visibility) - 通过
omnigraph或 Python 脚本驱动简单状态切换(比如“零件A显示→零件B高亮→爆炸位移”) - 导出时间采样数据(
timeSamples)供其他工具消费,但它本身不提供时间轴编辑界面或关键帧插值
想在 Omniverse 里做分步装配动画,实际怎么做
必须绕过 Composer 的“纯编排”定位,用更底层的 USD 时间采样 + Python 自动化生成动画数据。典型路径如下:
- 用 Python 获取每个装配步骤的目标位姿(例如从 Excel 表或 JSON 配置读取
prim.GetAttribute("xformOp:transform").Set()) - 在指定时间码(
stage.SetStartTimeCode()、stage.SetEndTimeCode())调用Set()并传入Sdf.TimeCode,手动写入多帧matrix4d值 - 确保所有参与装配的 prim 启用了
animated标记(prim.CreateAttribute("omni:anim:isAnimated", Sdf.ValueTypeNames.Bool).Set(True)) - 播放时依赖 Omniverse Viewport 的时间滑块,或导出为带时间采样的 USDZ 供外部渲染器使用
示例片段(设置某零件在第0帧和第60帧的位置):
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
from pxr import Usd, UsdGeom, Sdf
stage = Usd.Stage.Open("assembly.usd")
prim = stage.GetPrimAtPath("/World/Part_001")
xform = UsdGeom.Xformable(prim)
xform_op = xform.AddXformOp(UsdGeom.XformOp.TypeTransform, UsdGeom.XformOp.PrecisionDouble)
<h1>第0帧:原始位置</h1><p>xform_op.Set(Gf.Matrix4d(1), time=Sdf.TimeCode(0))</p><h1>第60帧:装配到位</h1><p>xform_op.Set(Gf.Matrix4d(...), time=Sdf.TimeCode(60))
stage.Save()为什么别在 Composer UI 里拖关键帧
因为 Composer 界面根本不暴露时间轴、关键帧标记、插值类型(线性/贝塞尔)等控件。你尝试右键某个属性 → “Add Keyframe”,会发现菜单灰掉或报错 Not supported for this attribute type。这是设计使然——它面向的是协同建模流程,不是动画制作流程。
常见误操作包括:
- 在 Composer 中反复点击“Play”按钮,指望它自动播放装配序列 → 实际只触发一次当前视图刷新,无时间推进
- 把装配步骤拆成多个 Composer 场景再手动切换 → 丢失连续性,无法控制节奏与过渡
- 导出为 glTF 后想用 Three.js 补关键帧 → glTF 导出默认丢弃 USD 时间采样,需额外启用
exportAnimation开关并验证输出是否含channels和samplers
真正要落地分步装配指导,得接受一个现实:Composer 只管“装配逻辑描述”,动画数据得靠脚本生成、USD 底层写入,再交给 Viewport 或外部引擎渲染。漏掉时间采样写入这步,或者没设对 TimeCode 范围,整个动画就只是静帧切片。

















