admin管理员组文章数量:1426237
I'd like to move a piece of my code in which i build a THREE.Geometry object to a HTML5 Web Worker.
Since i don't want to serialize it to a string (for obvious performance purposes), i'd like to convert it to a Transferable Object like ArrayBuffer, File or Blob so i can pass it "by reference".
Do you know a efficient way to convert a THREE.Geometry to one of those objects ?
I'd like to move a piece of my code in which i build a THREE.Geometry object to a HTML5 Web Worker.
Since i don't want to serialize it to a string (for obvious performance purposes), i'd like to convert it to a Transferable Object like ArrayBuffer, File or Blob so i can pass it "by reference".
Do you know a efficient way to convert a THREE.Geometry to one of those objects ?
Share Improve this question asked Jul 3, 2013 at 8:15 SebastienSebastien 7121 gold badge15 silver badges26 bronze badges1 Answer
Reset to default 7 +50The most efficient way is to use the existing geometry buffers such as:
geometryGroup.__vertexArray
geometryGroup.__normalArray
They are created in WebGLRenderer.initMeshBuffers
.
How it works:
Create a Worker and import three.js using
importScripts("/js/lib/mrdoob-three.js-35db421/build/three.js");
In the worker you create another instance of the geometry you want to process.
Trigger one initial rendering in the main thred
renderer.render(scene, camera);
now the buffers are available...Send the required buffers from the main thread to the worker
Do the hard work on the geometry at the worker thread
Manually (there is no support for that in threejs) fill the required buffers (see
WebGLRenderer.setMeshBuffers)
e.g.: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; }
send the buffers back to the main thread and update the geometry there:
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 );
If you are doing plex operations on geometries this works well. Understanding how the buffers are created and used by WebGLRenderer
is important.
本文标签: javascriptHow to efficiently convert THREEGeometry to ArrayBufferFile or BlobStack Overflow
版权声明:本文标题:javascript - How to efficiently convert THREE.Geometry to ArrayBuffer, File or Blob? - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1745465237a2659503.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论