据我了解,你可以使用以下方法访问网格每个顶点的uv coords(“texels”):
geometry.faceVertexUvs[ materialIndex ][ faceIndex ][ vertexIndex ]
我正在努力的是vertexIndex
似乎遵循与
geometry.vertices[ vertexIndex ]
我创建了一个演示此问题的示例:http://andrewray.me/stuff/test-uv2.html
来源:http://andrewray.me/stuff/uv2.js
以上代码执行以下操作:
使用实用程序1
函数在索引dot
的平面顶点的位置绘制一个球体:
dot( floor.localToWorld( floor.geometry.vertices[1].clone() ) );
修改faceVertexUvs[0][0][1]
处的纹素,以便我们可以看到texel 1
的位置
floor.geometry.faceVertexUvs[0][0][1].add( new THREE.Vector2( 0.4, 0 ) );
您可以在示例页面中看到,球体正在平面的右上角(顶点1的位置)绘制,而被修改的纹理元素位于平面的左下角。顶点的索引不对齐! 这是一个three.js错误,还是我错过了一些关于纹素的内容?
我发现顶点看起来像这样:
texel index | vertex index
0 | 3
1 | 1
2 | 0
3 | 2
但是,我在尝试完成相关的uv映射任务时看到了一些其他意外行为,因此我不知道映射是否是我的错误的来源。
答案 0 :(得分:3)
我不知道是否有更好的方法,但映射似乎是这样的:
geometry.faceVertexUvs[ 0 ][ faceIndex ][ vertexIndex ]
vertexIndex
对应于 face 的顶点索引,而不是几何顶点数组。虽然呈现为0-3(对于四边形)的数字,但实际面将值定义为a-d(来自Face4 docs):
Face4( a, b, c, d ... )
> geometry.faces[0] // assuming faceIndex is 0
THREE.Face4 {a: 0, b: 2, c: 3, d: 1, normal: THREE.Vector3…}
看看那个,有我们的映射!
因此,要在它们之间进行映射,我们需要在该索引处找到面,并将0映射到a,1到b等,然后在geometry.vertices数组中查找。这是一个愚蠢但功能性的方式:
geometry.vertices[
geometry.faces[faceIndex][ String.fromCharCode(97 + vertexIndex) ]
];
其中vertexIndex是faceVertexUvs[0][faceIndex][vertexIndex]
提供的。 fromCharCode
将a
映射到0
,依此类推。现在我们为每个uv纹素提供顶点(和它的位置)! Woooo!