我可以将数组中的Faces添加到THREE.BufferGeometry中

时间:2016-05-24 08:52:08

标签: javascript three.js geometry mesh buffer-geometry

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

工人: 首先,我创建了一个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之前,这些面仍然存在于THREE.Geometry中(步骤1)。

如何将这些面添加到bufferGeometry?

1 个答案:

答案 0 :(得分:0)

缓冲区几何有两种类型:

  • <强>索引:

    在索引缓冲区几何中,位置存储在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;
相关问题