我将创建一个基于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?
答案 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;