THREE.js:将索引几何合并到缓冲区几何中

时间:2015-08-28 15:19:03

标签: three.js buffer

我试图将大量索引几何(如SphereGeometry)合并到一个缓冲区几何体中。

索引几何图形是我的预制'。

首先,我'压扁'预制件的索引如下:

var prefabFaceCount = prefabGeometry.faces.length;

for (var i = 0; i < prefabFaceCount; i++) {
    var face = prefabGeometry.faces[i];
    prefabIndices.push(face.a, face.b, face.c);
}

然后,我为每个预制件重复带有偏移量的索引,如下所示:

var prefabIndexCount = prefabGeometry.faces.length * 3;
var prefabVertexCount = prefabGeometry.vertices.length;

for (var i = 0; i < prefabCount; i++) {
    for (var k = 0; k < prefabIndexCount; k++) {
        bufferIndices[i * prefabIndexCount + k] = prefabIndices[k] + i * prefabVertexCount;
    }
}

当我的面数少于65535(prefabFaceCount * prefabCount)时,这样可以正常工作,但是当我超过这个数字时,我的指数会搞乱,导致三角形不正确。

面部少于65535个 correct indices

这是更多(注意中心的工件) incorrect indices

当我在缓冲更复杂的几何体如SphereGeometries(不应连接球体)时,这更为明显:

even more incorrect indices

我的猜测是,当缓冲区域测量通过调用BufferGeometry.computeOffsets()分块为偏移量时会出现问题。我尝试过不同的块大小和索引排序组合,但我还没有找到解决方案。

我必须:

a)在缓冲索引时考虑块大小

b)根据我预制&#39;

中的面孔数量计算块大小

c)做a和b的组合

d)完全做其他事情

任何指针都会非常感激。

1 个答案:

答案 0 :(得分:1)

索引属性存储在Uint16Array

Uint16无法引用高于65535的位置,因为它会溢出(uint16只会到2 ^ 16)

最简单的方法是将索引属性缓冲区更改为UJ32Array,如LJ建议的那样

(浏览器需要支持OES_element_index_uint扩展,但大多数浏览器都支持)