USD中Primvar名称连字符规则咨询及Blender导出适配问题
问题描述
使用USD.NET读取Blender导出的.usda文件时,遇到纹理加载的Primvar名称不匹配问题:
- Shader节点中的
uvmap节点(类型为UsdPrimvarReader_float2)指定的变量名为Cube_001-mesh-map-0(含连字符) - 但网格数据里的Primvar定义却是
primvars:Cube_001_mesh_map_0(用下划线替代了连字符) - 调用以下代码时,传入带连字符的名称无法找到对应的Primvar:
UsdGeomPrimvar? GetPrimvar(UsdPrim meshPrim, string parameterPath) { UsdGeomPrimvarsAPI api = new UsdGeomPrimvarsAPI(meshPrim); TfToken testToken = new TfToken(parameterPath); UsdGeomPrimvar primVar = api.GetPrimvar(testToken); if (primVar.IsDefined()) return primVar; return null; }
咨询:
- 这是否是USD或Blender导出需要遵循的约定?
- 将连字符统一转为下划线来查找Primvar是否安全?
解答
这是Blender导出USD时的标准命名转换行为,本质和USD的属性命名规范有关:
- Blender内部允许使用连字符作为资产名称,但USD的属性命名要求符合标识符规则,连字符属于非合法标识符字符,因此Blender导出时会自动把连字符替换为下划线。
- 把连字符转成下划线来查找Primvar是完全安全的,这是Blender→USD导出流程里的既定规则,也是USD属性命名的隐含约定。
如果想让代码更健壮,可以做兼容处理:
- 先尝试用原始传入的名称查找Primvar
- 找不到的话,将名称里所有的
-替换为_再重试查找 - 一般不需要反过来处理(下划线转连字符),因为很少有导出工具会把下划线转成连字符
内容的提问来源于stack exchange,提问作者mike
相关产品推荐
相关产品推荐

