将Geometry转换为Three.js中的BufferGeometry会增加顶点的数量吗?

时间:2015-10-22 20:52:40

标签: javascript three.js

我一直在使用fromGeometry方法从常规Geometry对象制作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对象有更多的顶点?或者几何对象在GPU中是“未压缩的”,所以它们实际上具有相同数量的顶点,而不是在我的Geometry对象中?

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

2 个答案:

答案 0 :(得分: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浮动

答案 1 :(得分: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给出了一个很好的例子,说明为什么会这样!