You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
}

咨询:

  1. 这是否是USD或Blender导出需要遵循的约定?
  2. 将连字符统一转为下划线来查找Primvar是否安全?
解答

这是Blender导出USD时的标准命名转换行为,本质和USD的属性命名规范有关:

  • Blender内部允许使用连字符作为资产名称,但USD的属性命名要求符合标识符规则,连字符属于非合法标识符字符,因此Blender导出时会自动把连字符替换为下划线。
  • 把连字符转成下划线来查找Primvar是完全安全的,这是Blender→USD导出流程里的既定规则,也是USD属性命名的隐含约定。

如果想让代码更健壮,可以做兼容处理:

  • 先尝试用原始传入的名称查找Primvar
  • 找不到的话,将名称里所有的-替换为_再重试查找
  • 一般不需要反过来处理(下划线转连字符),因为很少有导出工具会把下划线转成连字符

内容的提问来源于stack exchange,提问作者mike

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 18:36:25