我创建了一个 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 的想法涉及不使用索引。