Unity3D通过USD包导出场景时层级变换未正确继承问题咨询
问题解答
1. USD层级变换继承实现方式
USD原生默认支持Xform类型图元的变换向下层级继承,你完全可以基于这个逻辑开发自定义导出器:
- 核心规则是:只有类型为
UsdGeomXform的Prim才会将自身的变换属性传递给子节点,你在自定义导出逻辑时,对所有仅持有Transform组件的父级GameObject,导出时手动指定其Prim类型为Xform即可,不需要额外处理变换传递逻辑,USD运行时会自动处理继承。 - 你也可以直接修改官方导出的配置项来开启该能力,不需要从零开发自定义导出器。
2. 问题原因
你遇到的问题是Unity官方USD包的默认导出策略导致的:
- 对于没有挂载渲染、碰撞等组件的纯变换父节点(比如你的
SphereHolder),官方导出器默认会将其导出为无类型Prim,不会自动标记为Xform类型,因此它的变换属性不会被子节点继承。 - 大部分仅导出单个模型、无复杂层级摆位的项目不会触发该问题,只有用到空节点做层级管理的场景导出才会碰到,属于高频小场景坑。
3. 无需烘焙变换的现成解决方案
你可以按优先级依次尝试以下方案,完全不需要把变换烘焙到叶子节点:
- 方案1(无代码修改):给所有纯变换父节点(比如你的
SphereHolder)挂载Unity USD包自带的UsdXform组件,导出时会自动被识别为Xform类型Prim,变换会自动继承。 - 方案2(修改现有导出代码):在你的导出逻辑中新增两个ExportContext配置项,修改后代码如下:
ssgo = GameObject.Find("SimpleScene"); if (ssgo != null) { context = new ExportContext(); context.scene = scene; context.scene.Time = null; context.activePolicy = ActiveExportPolicy.ExportAsVisibility; // 新增以下两行配置 context.exportLocalTransforms = true; context.bakeTransformType = BakeTransformType.Local; SceneExporter.SyncExportContext(ssgo, context); SceneExporter.Export(ssgo, context, zeroRootTransform: false); }
- 方案3(最小自定义修改):如果前两个方案不生效,你可以在
SyncExportContext之后遍历导出上下文的所有Prim,对纯变换父节点的Prim手动调用UsdGeomXform.Define(context.scene, primPath)指定为Xform类型即可。
内容的提问来源于stack exchange,提问作者Mike Wise
相关产品推荐
相关产品推荐

