2013-07-03 61 views

回答

4

最有效的方法是使用现有的几何体的缓冲液如:

geometryGroup.__vertexArray 
geometryGroup.__normalArray 

他们在WebGLRenderer.initMeshBuffers创建。

工作原理:

  1. 使用importScripts("/js/lib/mrdoob-three.js-35db421/build/three.js");

  2. 在工人创建要处理的几何形状的另一个实例创建工作和进口three.js所。

  3. 触发一个主thred renderer.render(scene, camera);现在缓冲区可用初始渲染...

  4. 从主线程发送所需要的缓冲区工人

  5. 做几何体上的辛勤工作在工作线程

  6. 手动(没有用于在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; 
    } 
    
  7. 发送缓冲区回主线程和更新几何参数有:

    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如何创建和使用缓冲区很重要。

+0

尼斯和完整的答案,似乎值得赏金。 – Sebastien

+0

我不确定我是不是应该直接在数组缓冲区上做些努力,并且在工作者之外建立一个正确的THREE.Geometry(从数组中) – Sebastien

+0

'for(f in 0 ..) .obj_faces.length){'确切的工作?根据Google Chrome浏览器的语法无效,在2013年编写答案时,您有什么浏览器记住了您的想法? – Ferrybig