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

THREE.js: merging indexed geometries into buffer geometry

我正在尝试将大量索引几何体(如 SphereGeometry)合并到单个缓冲区几何体中。

索引几何是我的'prefab'。

首先,我 'flatten' 将预制件的索引放入这样的数组中:

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 张面孔

这是更多(注意中间的神器)

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

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

我必须:

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

b) 根据我'prefab'

中的面数计算块大小

c) 组合 a 和 b

d) 完全做其他事情

任何指点将不胜感激。

索引属性存储在Uint16Array

uint16 不能引用高于 65535 的位置,因为它会溢出(uint16 刚到 2^16)

最简单的方法是按照 LJ 的建议将索引属性缓冲区更改为 Uint32Array

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