基于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
相关产品推荐
相关产品推荐

