4

私が理解している限り、次を使用してメッシュの各頂点の UV 座標 (「テクセル」) にアクセスできます。

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]どこにあるかを確認できるようにします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 マッピング タスクを実行しようとしているときに、他の予期しない動作が見られるため、マッピングがエラーの原因であるかどうかはわかりません。

4

1 に答える 1

4

より良い方法があるかどうかはわかりませんが、マッピングは次のように機能するようです:

geometry.faceVertexUvs[ 0 ][ faceIndex ][ vertexIndex ]

vertexIndexジオメトリ頂点配列ではなく、の頂点インデックスに対応します。0 ~ 3 の数値 ( quad の場合) として表示されますが、実際の面では値が ad として定義されます ( 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マップなど。これで、各 UV テクセルの頂点 (およびその位置) が得られました。うわー!a0

于 2013-06-26T07:11:50.197 に答える