three.js - geometry.faceVertexUvs [0] [0] [index]与geometry.vertices [index]不同

时间:2013-06-25 09:07:42

标签: javascript three.js

据我了解,你可以使用以下方法访问网格每个顶点的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映射任务时看到了一些其他意外行为,因此我不知道映射是否是我的错误的来源。

1 个答案:

答案 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]提供的。 fromCharCodea映射到0,依此类推。现在我们为每个uv纹素提供顶点(和它的位置)! Woooo!