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 扩展,但大多数浏览器支持)
我正在尝试将大量索引几何体(如 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 扩展,但大多数浏览器支持)