2015-10-22 36 views
2

我一直在使用fromGeometry方法来从常规的几何对象中创建BufferGeometry对象,并且我发现在转换过程中似乎增加了顶点的数量。例如,如果我这样做:在Three.js中将几何转换为BufferGeometry会增加顶点的数量吗?

var geometry = new THREE.BoxGeometry(80,80,80,16,16,16); 
var bGeometry = new THREE.BufferGeometry(); 
bGeometry.fromGeometry(geometry); 
console.log(bGeometry.getAttribute('position')); 
console.log(geometry.vertices.length); 

我得到一个Float32Array [27648],它由3个产量9216分,而几何具有1538个顶点。我理解THREE.BoxGeometry合并了一些顶点,所以我怀疑这可能与它有关,但我确定BoxGeometry对象具有更多顶点吗?还是Geometry对象在GPU中“未压缩”,因此它们实际上具有相同数量的顶点,而不是在我的几何对象中?

的原因,我问的是,我试图创建一个自定义属性,但是我的数组太短时,我只迭代,在我的几何对象的顶点数量,以为会有相同数量的两个对象中的顶点。

回答

2

找出这些问题的答案的最好方法就是查看three.js代码。这是非常方便,一般容易遵循。

首先我们可以看一下BufferGeometry.fromGeometry方法:

fromGeometry: function (geometry) { 

    geometry.__directGeometry = new THREE.DirectGeometry().fromGeometry(geometry); 

    return this.fromDirectGeometry(geometry.__directGeometry); 

} 

,你可以看到在呼唤DirectGeometry.fromGeometry

fromGeometry: function (geometry) { 
    // ... 
    var vertices = geometry.vertices; 
    // ... 
    for (var i = 0; i < faces.length; i ++) { 
     // ... 
     this.vertices.push(vertices[ face.a ], vertices[ face.b ], vertices[ face.c ]); 
     // ... 
    } 
    // ... 
} 

在这里,你可以清楚地看到,它补充说,来自额外顶点几何面临属性。 gaitat的答案给出了一个很好的例子,为什么这是!

4

让我们来看一个简单的例子BoxGeometry(80,80,80,1,1,1),对于框BufferGeometry我们得到36个顶点,对于框Geometry我们得到8个顶点。这怎么可能?让我们做数学运算:

要定义一个盒子,我们只需要8个顶点来定义12个构成该形状的三角形;但是对于盒子的每个顶点,您都有6个三角形共享它。请记住,立方体的每个面都有2个三角形。

如果你解开箱子Geometry的所有三角形成箱BufferGeometry您有:6 faces x 2 triangles per face x 3 vertices per triangle x 3 floats per vertex = 108彩车

+0

这听起来很低效。如果只存储8个顶点(24个浮点数),那么是否会有多余的冗余?然后有一个指向每个顶点顶点的参考数组?例如,face1由顶点[0,1,2] face2:[0,2,3]等组成? – Marquizzo

+1

你的建议是IndexedGeometryBuffers。 – gaitat

+0

哦,很高兴知道!我想我还有很多东西需要学习。 – Marquizzo

相关问题