我可以将面孔从数组添加到 THREE.BufferGeometry

Can I add Faces from an array to a THREE.BufferGeometry

我将创建一个基于 BufferGeometry 的网格。 目前我有一个工人负责我的几何。

工人: 首先,我创建一个 Three.Geometry。然后我构建我的 bufferGeometry 并将数据发送回主线程。

1.) 我将几何图形转换为 THREE.BufferGeometry

var bufferGeometry = new THREE.BufferGeometry().fromGeometry ( geometry );

2.) 接下来我得到 BufferAttributes

var attributePosition = bufferGeometry.getAttribute(name);//name = position, color, normal)

3.) 接下来我创建一个 bufferArray

bufferArrayPosition.push(attributePosition);

4.) 最后我将这些数组发送回主线程

postMessage([bufferArrayColor, bufferArrayNormal, bufferArrayPosition]);

主线程: 在主线程中,我重建了 bufferGeometry 并将其转换为 THREE.Geometry

 //receive messages from web worker
    worker.onmessage = function (e) {
        alert(e.data);

        var bufferGeometry = new THREE.BufferGeometry();
        var geometry = new THREE.Geometry();

        for (var i = 0; i < e.data[0].length; i ++){
            bufferGeometry.addAttribute('color', e.data[0][i].array, 3); 
            bufferGeometry.addAttribute('normal', e.data[1][i].array, 3);
            bufferGeometry.addAttribute('position', e.data[2][i].array, 3);

            var t = new THREE.Geometry().fromBufferGeometry(bufferGeometry);
            material.side = THREE.DoubleSide;
            mesh.push(new THREE.Mesh(t, material));
            Scene.scene.add(mesh[i]);
        }

    };

最后三角面丢了!!!我只有标准面指数 (0,1,2) (3,4,5), ... 实际上我正在工作线程中做一些三角测量。在转换为 bufferGeometry(步骤 1)之前,这些面仍然存在于 THREE.Geometry 中。

如何将这些面添加到 bufferGeometry?

有两种缓冲区几何形状:

  • 索引:

    在索引缓冲区几何中,位置存储在 position 缓冲区属性中,索引存储在 index 缓冲区属性中。位置可以在索引缓冲区几何中重复使用。

  • 非索引(又称三角汤)

    在非索引数组中,没有索引属性,所有位置都存储在位置缓冲区属性中,position 属性中的每三个后续点形成一个三角形。

如果您的原始缓冲区几何被索引,您将必须确保您的三角形定义(因此来自 index 属性的索引数组)也被发送回您的主线程并用于重新创建缓冲区几何。

您可以使用 the getIndex method 从缓冲区几何中获取它,如下所示:

indexAttribute = bufferGeometry.getIndex();

更新

Here a fiddle that demonstrates geometry vs buffer geometry 一个简单的正方形。

// What you need to send to main thread from your worker:
positions = bufferGeometry.attributes['position'].array;
indices = bufferGeometry.index.array;