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

基于USD的Python开发:为立方体各面映射相同纹理

USD立方体纹理映射异常修复方案

纹理映射错误的立方体背面

我创建了一个简单的网格立方体,希望为立方体的每个面应用同一张图像。目前的实现效果是正面纹理显示正常,但其他面存在异常,以下是我的原始代码实现:

# create mesh with texture coordinates
stage.DefinePrim('/' + assetName + '/Geom', 'Scope')
mesh = UsdGeom.Mesh.Define(stage, '/' + assetName + '/Geom/cube')
mesh.CreateSubdivisionSchemeAttr().Set(UsdGeom.Tokens.none)
mesh.CreatePointsAttr([(-x/2, -y/2, z/2), (x/2, -y/2, z/2), (-x/2, y/2, z/2), (x/2, y/2, z/2), (-x/2, y/2, -z/2), (x/2, y/2, -z/2), (-x/2, -y/2, -z/2), (x/2, -y/2, -z/2)])
mesh.CreateExtentAttr(UsdGeom.PointBased(mesh).ComputeExtent(mesh.GetPointsAttr().Get()))
mesh.CreateNormalsAttr([(0,0,1), (0,1,0), (0,0,-1), (0,-1,0), (1,0,0), (-1,0,0)])
mesh.SetNormalsInterpolation(UsdGeom.Tokens.uniform)

mesh.CreateFaceVertexCountsAttr([4, 4, 4, 4, 4, 4])
mesh.CreateFaceVertexIndicesAttr([0,1,3,2, 2,3,5,4, 4,5,7,6, 6,7,1,0, 1,7,5,3, 6,0,2,4]) # per-face vertex indices
    
texCoords = mesh.CreatePrimvar('st', Sdf.ValueTypeNames.TexCoord2fArray, UsdGeom.Tokens.faceVarying) # a 'faceVarying' mesh attribute is stored per-face per-vertex
texCoords.Set([(0, 0),(1, 0), (1,1), (0, 1), (0, 0), (1, 0), (1, 1), (0, 1), (0, 0), (1, 0), (1, 1), (0, 1), (0, 0), (1, 0)])

texCoords.SetIndices(Vt.IntArray([0,1,2,3, 3,2,4,5, 5,4,6,7, 7,6,8,9, 1,10,11,2, 12,0,3,13]))

问题原因

问题出在faceVarying类型纹理坐标的数组长度和索引匹配错误:

  • faceVarying属性要求为每个面的每个顶点单独分配纹理坐标,6个面共需24个纹理坐标数据,但原始代码只提供了14个,数量不足。
  • 索引数组引用了超出纹理坐标数组长度的位置,导致部分面的纹理坐标错乱。

修正后的代码

只需修改纹理坐标的设置部分:

# 创建faceVarying类型的纹理坐标属性
texCoords = mesh.CreatePrimvar('st', Sdf.ValueTypeNames.TexCoord2fArray, UsdGeom.Tokens.faceVarying)
# 为6个面的每个顶点提供纹理坐标,每个面按(左下,右下,右上,左上)的顺序设置
texCoords.Set([
    (0,0), (1,0), (1,1), (0,1),  # 正面(z+方向)
    (0,0), (1,0), (1,1), (0,1),  # 顶面(y+方向)
    (0,0), (1,0), (1,1), (0,1),  # 背面(z-方向)
    (0,0), (1,0), (1,1), (0,1),  # 底面(y-方向)
    (0,0), (1,0), (1,1), (0,1),  # 右面(x+方向)
    (0,0), (1,0), (1,1), (0,1)   # 左面(x-方向)
])

# 索引数组与面顶点索引一一对应,每个面的4个顶点对应纹理数组的连续4个索引
texCoords.SetIndices(Vt.IntArray([
    0,1,2,3,    # 正面
    4,5,6,7,    # 顶面
    8,9,10,11,  # 背面
    12,13,14,15,# 底面
    16,17,18,19,# 右面
    20,21,22,23 # 左面
]))

关键说明

  • faceVarying属性的纹理坐标数量必须等于所有面的顶点总数(6×4=24)。
  • 索引数组的长度要和FaceVertexIndices的长度完全一致,每个元素对应纹理坐标数组中的位置,确保顶点与纹理坐标正确绑定。
  • 每个面的纹理坐标按(0,0)-(1,0)-(1,1)-(0,1)的顺序设置,与顶点的绘制顺序匹配,就能保证每个面的纹理正常显示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 21:35:13