一連の三角形を格納する BufferGeometry を作成しました (後で頂点シェーダーを使用して操作するため)。頂点の位置座標と色はランダムに生成され、bufferGeometry.attributes プロパティ内の配列として追加されました。メッシュの作成に使用すると、うまく機能しました。ここにコードがあります:-
//... Buffer Geometry
triangles = 500;
Bgeometry = new THREE.BufferGeometry();
Bgeometry.dynamic = true;
//... Bvertex_coords
Bvertex_coords = new Float32Array( triangles * 3 * 3 );
for ( var i = 0, l = triangles * 3 * 3; i < l; i += 3 )
{
Bvertex_coords[ i ] = Math.random() - 0.5;//... x
Bvertex_coords[ i + 1 ] = 2*(Math.random() - 0.5);//... y
Bvertex_coords[ i + 2 ] = Math.random() - 0.5;//... z
}
Bgeometry.addAttribute( 'position', new THREE.BufferAttribute( Bvertex_coords, 3 ) );
次に、同様の BufferGeometry を作成したいのですが、今回は三角形を最初に球状の「表面」に配置する必要があります。そこで、適切な構成で「ドナー」の SphereBufferGeometry を作成しました。
次に、関連データをドナー SphereBufferGeometry から BufferGeometry に単純にコピーするというアイデアでした。
これが私が使用しているコードです:-
//... Buffer Geometries
////... new (r72) method - create a "donor" sphereBufferGeometry
var Cgeometry = new THREE.SphereBufferGeometry( 1, 4, 4 );
var num_Cgeom_pos_coords = Cgeometry.attributes.position.array.length;
var num_Cgeom_vertices = num_Cgeom_pos_coords/3;
//...Dgeometry
//... first make a plain buffer geometry
//... then copies data from an existing BufferSphereGeometry
Dgeometry = new THREE.BufferGeometry();
Dgeometry.dynamic = true;
Dpos_coords = new Float32Array( num_Cgeom_pos_coords );
Dpos_normals = new Float32Array( num_Cgeom_pos_coords );
for ( var pc = 0; pc < num_Cgeom_pos_coords ; pc ++ )
{
Dpos_coords[ pc ] = Cgeometry.attributes.position.array[pc];
Dpos_normals[ pc ] = Cgeometry.attributes.normal.array[pc];
}
Dgeometry.addAttribute( 'position', new THREE.BufferAttribute( Dpos_coords, 3 ) );
Dgeometry.addAttribute( 'normal', new THREE.BufferAttribute( Dpos_normals,3 ) );
Pack_of_Triangles_mesh_D = new THREE.Mesh( Dgeometry, Sphere_Ord_material);
何らかの理由で、SphereBufferGeometry から BufferGeometry にコピーしてメッシュを作成すると、三角形のごく一部 (約 20 ~ 25%?) のみが実際にプロットされます。
質問
私の質問は次のとおりです。すべての三角形をプロットするにはどうすればよいですか?
更新1
対照的に、次の方法は問題なく動作します: (1) SphereGeometry でメッシュを作成し、(2) .setFromObject(mesh) で新しい BufferGeometry を作成します (3) 以前の BufferGeometry から新しい BufferGeometry にコピーし、後者を使用して新しいメッシュ。しかし、これは長ったらしいアプローチのようです。
更新2
Cgeometry が SphereBufferGeometry の場合、次のメソッドも問題なく動作します。
Dgeometry = new THREE.BufferGeometry();
Dgeometry.copy ( Cgeometry );
var num_Dgeom_pos_coords = Dgeometry.attributes.position.array.length;
var num_D_geom_vertices = num_D_geom_pos_coords/3;
元の問題は、インデックス作成が SphereBufferGeometry で使用されており、新しい BufferGeometry でデフォルトでインデックスが構築されていないことが原因のようです。
インデックスを SphereBufferGeometry から新しい BufferGeometry にコピーする簡単な方法はないようです。
BufferGeomtry のアイデアには、インデックスを作成せずに行うことが含まれていると思ったので、少し混乱しています。