THREE.js从SphereBufferGeometry复制到BufferGeometry

时间:2016-03-19 14:49:09

标签: javascript three.js geometry buffer buffer-geometry

我创建了一个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的想法涉及到没有索引。

0 个答案:

没有答案