gpt4 book ai didi

javascript - 如何高效地将 THREE.Geometry 转换为 ArrayBuffer、File 或 Blob?

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:49:44 24 4
gpt4 key购买 nike

我想将构建 THREE.Geometry 对象的一段代码移动到 HTML5 Web Worker。 .

由于我不想将它序列化为字符串(出于明显的性能目的),我想将它转换为 Transferable Object例如 ArrayBuffer、File 或 Blob,所以我可以“通过引用”传递它。

您知道将 THREE.Geometry 转换为其中一个对象的有效方法吗?

最佳答案

最有效的方法是使用现有的几何缓冲区,例如:

geometryGroup.__vertexArray
geometryGroup.__normalArray

它们在 WebGLRenderer.initMeshBuffers 中创建。

工作原理:

  1. 使用 importScripts("/js/lib/mrdoob-three.js-35db421/build/three.js"); 创建一个 Worker 并导入 three.js;

  2. 在 worker 中,您可以创建另一个要处理的几何实例。

  3. 在主线程 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 如何创建和使用缓冲区很重要。

关于javascript - 如何高效地将 THREE.Geometry 转换为 ArrayBuffer、File 或 Blob?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17442946/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com