我想移动一段我的代码,在其中构建一个THREE.Geometry对象到HTML5 Web Worker。由于我不想序列化为一个字符串(出于明显的性能目的),我想将它转换为像ArrayBuffer,File或Blob Transferable Object,所以我可以通过它“通过引用”。如何有效地将THREE.Geometry转换为ArrayBuffer,File或Blob?
您是否知道将THREE.Geometry转换为其中一个对象的有效方法?
我想移动一段我的代码,在其中构建一个THREE.Geometry对象到HTML5 Web Worker。由于我不想序列化为一个字符串(出于明显的性能目的),我想将它转换为像ArrayBuffer,File或Blob Transferable Object,所以我可以通过它“通过引用”。如何有效地将THREE.Geometry转换为ArrayBuffer,File或Blob?
您是否知道将THREE.Geometry转换为其中一个对象的有效方法?
最有效的方法是使用现有的几何体的缓冲液如:
geometryGroup.__vertexArray
geometryGroup.__normalArray
他们在WebGLRenderer.initMeshBuffers
创建。
工作原理:
使用importScripts("/js/lib/mrdoob-three.js-35db421/build/three.js");
在工人创建要处理的几何形状的另一个实例创建工作和进口three.js所。
触发一个主thred renderer.render(scene, camera);
现在缓冲区可用初始渲染...
从主线程发送所需要的缓冲区工人
做几何体上的辛勤工作在工作线程
手动(没有用于在threejs不支持)填写所需要的缓冲区(见WebGLRenderer.setMeshBuffers)
例如:
var vertexArray = new Float32Array(vertexBuffer);
var normalArray = new Float32Array(normalBuffer);
var vertices : Array = geometry.vertices;
var obj_faces : Array = geometry.faces;
var offset = 0;
var offset_normal = 0;
for (f in 0...obj_faces.length) {
var face = obj_faces[ f ];
var v1 = vertices[ face.a ];
var v2 = vertices[ face.b ];
var v3 = vertices[ face.c ];
var v4 = vertices[ face.d ];
vertexArray[ offset ] = v1.x;
vertexArray[ offset + 1 ] = v1.y;
vertexArray[ offset + 2 ] = v1.z;
vertexArray[ offset + 3 ] = v2.x;
vertexArray[ offset + 4 ] = v2.y;
vertexArray[ offset + 5 ] = v2.z;
vertexArray[ offset + 6 ] = v3.x;
vertexArray[ offset + 7 ] = v3.y;
vertexArray[ offset + 8 ] = v3.z;
vertexArray[ offset + 9 ] = v4.x;
vertexArray[ offset + 10 ] = v4.y;
vertexArray[ offset + 11 ] = v4.z;
offset += 12;
}
发送缓冲区回主线程和更新几何参数有:
var geometryGroup = mesh.geometry.geometryGroupsList[0];
var _gl = renderer.context;
_gl.bindBuffer(_gl.ARRAY_BUFFER, geometryGroup.__webglVertexBuffer);
_gl.bufferData(_gl.ARRAY_BUFFER, transferVertexArray, _gl.DYNAMIC_DRAW);
如果你正在做的几何形状复杂的操作,这个效果很好。了解WebGLRenderer
如何创建和使用缓冲区很重要。
尼斯和完整的答案,似乎值得赏金。 – Sebastien
我不确定我是不是应该直接在数组缓冲区上做些努力,并且在工作者之外建立一个正确的THREE.Geometry(从数组中) – Sebastien
'for(f in 0 ..) .obj_faces.length){'确切的工作?根据Google Chrome浏览器的语法无效,在2013年编写答案时,您有什么浏览器记住了您的想法? – Ferrybig