我可以将面孔从数组添加到 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;
我将创建一个基于 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;