我创建了一个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%?)的三角形。
问题
所以我的问题是:我需要做些什么来绘制所有三角形?
UPDATE1
相比之下,下面的方法可以正常工作:(1)用SphereGeometry创建一个网格,(2)用.setFromObject(mesh)(3)创建一个新的BufferGeometry从前一个BufferGeometry复制到一个新的BufferGeometry并使用后者制作一个新的网格。但这似乎是一个冗长的方法。
UPDATE2
当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的想法涉及到没有索引。