1

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

4

0 回答 0