OpenUSD 端到端示例:从资产创建、着色变体到 Sequence/Shot 分层与渲染的完整流水线

发布时间:2026/9/16 16:40:26
OpenUSD 端到端示例:从资产创建、着色变体到 Sequence/Shot 分层与渲染的完整流水线 OpenUSD 端到端示例从资产创建、着色变体到 Sequence/Shot 分层与渲染的完整流水线【免费下载链接】OpenUSDUniversal Scene Description项目地址: https://gitcode.com/GitHub_Trending/ope/OpenUSD本篇基于仓库文档 tut_end_to_end.rst 及配套脚本完整讲解 OpenUSD 官方“End to End Example”教程如何用create_asset.py引导bootstrap一个标准资产、如何用纯 Python 代码为 Ball 资产添加 15 组着色变体、如何聚合出 Room_set 场景再进一步按“sequence序列/shot镜头/department部门”建立分层组织结构并写入 layout、anim 部门内容最后完成渲染。跟完本篇你将掌握 USD 资产的标准目录结构、引用reference与子层sublayer的组合方式、variant set 的代码化编写以及SetEditTarget指定编辑目标层的经典工作流。教程目标与文件布局该教程演示一条被刻意简化的 USD 制作流水线。全部文件位于 extras/usd/tutorials/endToEnd 目录包含三部分以下命令默认从教程根目录endToEnd执行assets/教程所需的资产文件以及预先生成的几何体——如果你没有 Maya 环境可以直接拷贝这些文件跳过建模环节scripts/通用的资产/镜头脚手架脚本create_asset.py、create_shot.py支持-h查看用法tutorial_scripts/专为该教程编写的脚本可能包含硬编码的相对路径应假定你按教程顺序执行。教程的三大目标是如何从 Maya 生成 USD 文件历史上经由pxrUsdMaya插件现已迁移见后文说明如何检查introspectUSD 文件如何用代码操纵 USD 文件。创建资产模型Create AssetsBootstrap用 create_asset.py 引导资产首先运行引导脚本在models/Ball目录下创建一个名为 Ball 的空资产python scripts/create_asset.py Ball --shadingVariantLayer -o models/Ballcreate_asset.py见 create_asset.py支持以下参数参数默认值作用-k, --kindcomponent设置资产的 model kind-o, --outputDir与资产同名资产输出目录-s, --shadingVariantLayer关在模型引用中加入asset.shadingVariants.usda-f, --force关输出目录已存在时不报错该脚本会创建 ASCII 格式的顶层层便于阅读并做三件关键的事把资产 prim 定义为 stage 的defaultPrim设置upAxis Y让查看器正确放置自由摄像机通过Usd.ModelAPI写入 kind、assetInfo.name与assetInfo.assetIdentifier。加上--shadingVariantLayer后脚本先引用着色变体层、再引用几何层——因为着色需要比几何更强的意见opinion必须排在前面。生成结果与仓库中已提交的 assets/Ball/Ball.usd 结构一致#usda 1.0 ( defaultPrim Ball upAxis Y ) def Xform Ball ( assetInfo { asset identifier Ball/Ball.usd string name Ball } kind component prepend references [ ./Ball.shadingVariants.usda, ./Ball.maya.usd ] ) { }可以继续验证ls models/Ball usdcat models/Ball/*.usd usdview models/Ball/Ball.usd此时还没有几何体但只要usdview能无错误打开就说明资产骨架已经正确。注意把每个模型放进独立目录便于版本管理但这只是示例布局并非 USD 的要求。同样地为桌子创建一个资产python scripts/create_asset.py Table -o models/Table从 Maya 导出几何体历史参考重要提示随 USD 分发的 Maya 插件已并入 Autodesk 的 maya-usd 项目本节内容仅作历史参考。若没有 Maya 环境可以直接拷贝仓库中预导出的资产然后跳到“着色变体”一节cp assets/Ball/Ball.maya.usd models/Ball/Ball.maya.usd cp assets/Table/Table.maya.usd models/Table/Table.maya.usd usdview models/Ball/Ball.usd usdview models/Table/Table.usd你应该能在 Ball 资产中看到球面网格。如果确实要走 Maya 流程在 Maya 的 Plug-in ManagerWindows → Settings/Preferences → Plug-in Manager中加载pxrUsdMaya插件或在 MEL 窗口输入loadPlugin pxrUsd然后打开assets/Ball/Ball.ma含简单球体的几何与着色maya assets/Ball/Ball.ma选中球体后执行File → Export Selection在Files of type中选择pxrUsdExportshading mode 必须选 RfM保存覆盖models/Ball/Ball.maya.usd。同样步骤处理assets/Table/Table.ma导出到models/Table/Table.maya.usd。完成后可以用以下命令查看usdview models/Ball/Ball.usd # 在 usdview 中可用 ctrl- 和 ctrl 切换细分层级用代码添加着色变体Shading Variants这一节完全用代码为 Ball 添加着色变体核心脚本是 add_shadingVariants.py。先把贴图拷贝进来cp -r assets/Ball/tex models/Ball/ python tutorial_scripts/add_shadingVariants.py usdcat models/Ball/Ball.shadingVariants.usda该脚本假设你按教程顺序操作、Ball 已带有 Maya 文件导出的着色若你改动过资产可能需要修改脚本。脚本的关键实现值得逐行理解创建层并设定默认 prim新建Ball/Ball.shadingVariants.usdastage.GetRootLayer().defaultPrim Ball然后用stage.OverridePrim(/Ball)取得 override 句柄创建 variant setmodel.GetVariantSets().AddVariantSet(shadingVariant)随后循环添加Cue及Ball_1~Ball_15共 16 个变体在每个变体内编写authoring通过with shadingVariant.GetVariantEditContext():上下文管理器让编写操作写入当前变体——先修改BallTexture着色器的filename参数指向不同贴图tex/ballN.tex仓库中仅随附 1、4、8、9 号贴图再通过UsdGeom.Gprim(mesh).CreateDisplayColorAttr([color])设置 Hydra 使用的 display color颜色空间转换_Color辅助函数调用Gf.ConvertDisplayToLinear把 sRGB 显示空间颜色转成线性空间再写入最后把默认选择设为CueshadingVariant.SetVariantSelection(Cue)否则默认会是最后一个被创建的变体。教程刻意保持着色网络极简。在usdview中查看models/Ball/Ball.usd选中/Ball切到 Meta Data 标签页使用shadingVariant下拉菜单即可在 15 种颜色变体之间切换。场景聚合Set Dressing 与 Room_setcreate_Room_set.py 会把 Table 和 15 个 Ball 组装成一个“聚合模型”assemblypython tutorial_scripts/create_Room_set.py usdview models/Room_set/Room_set.usd脚本要点源码级创建models/Room_set/Room_set.usd把/Room_set设为defaultPrimupAxis Y并Usd.ModelAPI(setModelPrim).SetKind(Kind.Tokens.assembly)——kind 用于让其他应用理解模型层级_AddModel()辅助函数确保路径上的所有祖先 prim 都被创建为kind group然后用stage.DefinePrim(path)GetReferences().AddReference(...)挂接资产引用15 个 Ball 按 5 行三角形排列位置由TABLE_HEIGHT 74.5、BALL_RADIUS 5.715 * 0.5计算得出变换通过UsdGeom.XformCommonAPI(b).SetTranslate(ballXlate)写入使用 XformCommonAPI 的 SRTpivot 写法可保证变换在不同应用间可互换由于着色变体的名字与球的名字一一对应Ball_1…Ball_15脚本直接用b.GetVariantSets().GetVariantSet(shadingVariant).SetVariantSelection(shadingVariantName)为每个球选定自己的颜色。两个注意点该脚本预期models/Ball与models/Table已存在且假设了特定尺寸改动过资产可能需要同步修改脚本脚本中硬编码了到其它资产的绝对路径。实际项目中USD 的 path resolver 插件提供了更灵活的机制允许以其他方式定位资产。打开usdview models/Room_set/Room_set.usd后可能需要移动摄像机才能看到桌子与球阵。Shot 工作Sequence/Shot 分层结构这一部分示范一个典型动画流水线的镜头组织方式并展示 USD 组合composition带来的好处。概念定义sequence序列是一组相关镜头的集合每个 shot 通过sublayering引入所属 sequence 的全部场景描述从而让“影响多个镜头的意见”集中在一处每个 sequence 再从全局共享的shot.usd继承意见把“到处都要用的东西”例如摄像机定义在一处另一条组织轴是部门department一个 shot 可以分别有 layout、animation、sim 部门各自的层sequence 同理。本教程构建的 shot 的层顺序从最强到最弱# shot layers s00_01.usd s00_01_sim.usd s00_01_anim.usd s00_01_layout.usd s00_01_sets.usd # sequence layers s00.usd s00_sim.usd s00_anim.usd s00_layout.usd s00_sets.usd # global shot.usd注意USD 本身并不知道什么是“shot”或“sequence”这只是示例结构不是 USD 的要求。Sequence/Shot 搭建全局层 assets/shot.usd 只定义了世界骨架与摄像机#usda 1.0 def Xform World { def Xform sets { } def Xform anim { } def main_cam ( prepend references ./main_cam.usd ) { } }可用usdcat assets/shot.usd查看。搭建 sequence 时虽然用的是 shot 脚本 create_shot.py支持-b/--baseLayer、-o/--outputDir、-f/--force参数python scripts/create_shot.py s00 -o shots/s00 -b assets/shot.usd这会在shots/s00下创建 sequence并引用assets/shot.usd——注意-b参数把该路径原样verbatim写入subLayerPaths位于部门层之后即最弱一层。接着创建 shotpython scripts/create_shot.py s00_01 -o shots/s00_01 -b shots/s00/s00.usd从源码看create_shot.py对每个 shot/sequence 都会创建name.usd顶层层并通过Sdf.LayerAPI 直接创建并追加sim/anim/layout/sets四个子层UsdAPI 没有直接编写subLayerPaths的接口因此这里落到 Sdf 层操作最后同样设置upAxis Y。现在 shot 会自动获得“shot 覆盖 sequence、sequence 覆盖全局”的意见链。新创建的 shot 与 sequence 里除了shot.usd中的摄像机外应该别无内容usdview shots/s00_01/s00_01.usd简单的镜头工作在 sequence 层引入场景add_set_to_s00.py 把Room_set资产引入 sequence 的 sets 部门python tutorial_scripts/add_set_to_s00.py usdview shots/s00/s00.usd其实现是整篇教程最值得记住的“指定编辑目标层”模式用Sdf.Layer.FindOrOpen取得shots/s00/s00_sets.usdstage.SetEditTarget(workingLayer)之后所有编写操作都落到该部门层然后确保/World、/World/sets为 group并用GetReferences().SetReferences([...])一次性替换而非追加挂接Room_set资产。layout 部门模拟 layout TD 加一颗母球、移除多余道具、摆好摄像机——先看组合结果s00_01已经引入了s00的意见再依次运行# s00_01 引入了来自 s00 的意见 usdview shots/s00_01/s00_01.usd # 建议在每条命令之间用 usdcat 检查生成的文件 python tutorial_scripts/layout_shot_s00_01.py python tutorial_scripts/anim_shot_s00_01.pylayout_shot_s00_01.py 的源码细节设置镜头时码范围stage.SetStartTimeCode(1)/stage.SetEndTimeCode(10)供其它应用使用SetEditTarget切到s00_01_layout.usd后引用Ball.usd到/World/anim/CueBall作为母球遍历/World/sets/Room_set/Props的子 prim只保留{Ball_1, Ball_4, Ball_8, Ball_9}对应仓库中随附贴图的四个球其余prim.SetActive(False)停用脚本特意先收集再停用避免遍历时删除球的位置以球半径为单位偏移通过XformCommonAPI.SetTranslate写入摄像机UsdGeom.Camera本身派生自Xformable移动到(8, 120, 8)并绕 X 轴旋转-86°SetRotate可选指定旋转顺序。anim 部门anim_shot_s00_01.py 把SetEditTarget切到s00_01_anim.usd对母球和几颗球在 1 帧与 10 帧之间写入线性关键帧先从xformAPI.GetXformVectors(Usd.TimeCode.Default())[0]取出当前平移量按方向向量与速度计算终点再分别SetTranslate(start, 1)、SetTranslate(end, 10)并用SetRotate(speed * Gf.Vec3f(3.7, 13.9, 91.34))给球加上旋转。运行usdview shots/s00_01/s00_01.usd即可看到时间线上的动画。渲染历史参考重要提示Katana 的 USD 插件已在 20.05 版本中从 USD 分发中移除由 Foundry 维护的 KatanaUsdPlugins 项目替代。本节不常做回归测试仅保留作为历史参考。渲染方式是在 endToEnd 教程根目录运行katana assets/simple.katanaassets/simple.katana 脚本中USD 文件由PxrusdIn节点读入场景会合并一个可选摄像机用于规避“直接从 USD 文件内的摄像机渲染”的已知问题并在 Gaffer 节点中创建一个简单灯光。右键RenderSettings节点选择 Preview Render 即可出图。关键要点回顾这条端到端流水线浓缩了 USD 的几个核心机制且每一环都能在仓库源码中找到对应实现标准资产结构顶层层 defaultPrimassetInfokind 有序引用着色层强于几何层见 create_asset.pyvariant set 的代码编写AddVariantSet/AddVariant/SetVariantSelection与GetVariantEditContext上下文管理器配合实现“一个参数改变整个材质表现”见 add_shadingVariants.py组合聚合用XformCommonAPI摆放、用 variant selection 逐实例选色把 16 个资产组装成 assembly见 create_Room_set.py多层意见链subLayerPaths表达“shot sequence global”的从强到弱继承部门各自占一层互不干扰见 create_shot.py指定编辑目标层Sdf.Layer.FindOrOpenstage.SetEditTarget是部门 TD 脚本写回各自层的标准写法见 add_set_to_s00.py、layout_shot_s00_01.py 与 anim_shot_s00_01.py。完成全部步骤后你可以自由修改这些脚本或添加自己的几何与着色来继续实验仓库中 assets 目录下的Ball.maya.usd、shot.usd等成品文件也可作为各阶段结果的对照参考。【免费下载链接】OpenUSDUniversal Scene Description项目地址: https://gitcode.com/GitHub_Trending/ope/OpenUSD创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考