1

静かでシンプルなものが欲しいと思っていたのですが、思ったよりも複雑でした..

私が欲しいのは、THREE.BufferGeometry(球)のすべての頂点のメッシュだけです!

コードペン: codepen.io/cheesyeyes/pen/YwBZGz

これは私が欲しいものです

これは私のバッファジオメトリです:

var bufferGeometry = new THREE.SphereBufferGeometry(1,1,1);

頂点の位置を取得しようとしています:

bufferGeometry.getAttribute('position',0);

では、bufferGeometry のすべての頂点 (ここでは 5 つ) の位置を取得するために、それらを正しく読み取るにはどうすればよいでしょうか?

こんな感じでやってみました。それは実際には機能しますが、非常に醜いと思います:

vertexMesh.position.x=position.array[0];
vertexMesh.position.y=position.array[1];
vertexMesh.position.z=position.array[2];

for(i=12;i<position.array.length-9;i=i+3)
            { 

            //vertexGeometry
            var vertexGeometry = new THREE.SphereGeometry(0.1,32,32);

            var vertexMaterial = new THREE.MeshBasicMaterial({color:0xff0000});   

            var vertexMesh = new THREE.Mesh(vertexGeometry,vertexMaterial);    

            vertexMesh.position.x=position.array[i];
            vertexMesh.position.y=position.array[i+1];
            vertexMesh.position.z=position.array[i+2]; 

             scene.add(vertexMesh);

            }

この配列がどのように配置されているかわかりません..助けてください! ありがとう!

4

1 に答える 1

1

BufferGeometry は頂点を 1 次元配列に格納します。ここで、3 つのインデックスの各セットは単一の Vector3 (頂点位置) を表します。したがって、この配列がある場合:

var verts = [0, 0, 0, 0, 1, 0, 1, 1, 1];

(x, y, z) トリプレットで考えるべきです:

vert # 1: (0, 0, 0)
vert # 2: (0, 1, 0)
vert # 3: (1, 1, 1)

実際、three.js のドキュメントでこの例を見ることができます。BufferGeometry ページを読んでください。あなたの質問はおそらくそれ自体で答えられるでしょう:

// components of the position vector for each vertex are stored
// contiguously in the buffer.
for ( var i = 0; i < vertexPositions.length; i++ )
{
    vertices[ i*3 + 0 ] = vertexPositions[i][0];
    vertices[ i*3 + 1 ] = vertexPositions[i][1];
    vertices[ i*3 + 2 ] = vertexPositions[i][2];
}

そうは言っても、BufferGeometry を使用している特定の理由はありますか? 最適化のために本当に必要な場合にのみ、そのクラスを使用してください。BufferGeometry はそのデータを数値の生の配列として格納し、頂点を Vector3 の配列として便利に格納する通常の Geometry クラスよりもアクセスおよび操作がはるかに困難です。やむを得ない理由がない限り、BufferGeometry ではなく Geometry を使用してください。

于 2016-02-12T21:24:44.460 に答える