Three.js - 如何反序列化geometry.toJSON()? (geometry.fromJSON 在哪里?)

2024-03-17

我正在尝试卸载一些Geometry加载并处理到网络工作者中。要将其发送回主线程,Geometry实例需要序列化,看起来Geometry.prototype.toJSON()正是针对这种类型的事情。

但我不知道如何将该对象转回Geometry主线程中的实例。怎么样toJSON()应该使用输出?

PS:我见过这个相关问题 https://stackoverflow.com/questions/17442946/how-to-efficiently-convert-three-geometry-to-arraybuffer-file-or-blob,但似乎过时了。toJSON()尚未包含在 API 中。接受的答案有点复杂,并且要求我仍然在主线程中做一些原始工作。


如果我理解正确的话,问题是:

  • 您有一个要作为几何图形(obj、stl 等)加载的文件。
  • 您想要将此文件加载到 WebWorker 中。
  • 然后,您要将几何图形发送回主脚本。
  • 因此,您正在考虑将文件作为 JSON 发送回主线程,因为不支持发送对象。
  • 然后,您可以在主线程上将 json 转换为几何图形。

这样做的问题是,从 JSON 字符串转换为几何图形是另一个加载操作(这就是 JSONLoader 的原因),因此此时您可能刚刚在主线程上完成了加载。

我使用的方法是将文件加载到顶点和法线的平面数组中,然后将它们发送回主线程以添加到 BufferGeometry。您还可以使用可转移对象来获得更快的速度。

// worker.js

var vertices = new Float32Array( faces * 3 * 3 );
var normals = new Float32Array( faces * 3 * 3 );   

// Load your file into the arrays somehow.

var message = {
    status:'complete',
    vertices: vertices,
    normals: normals
};

postMessage(message, [message.vertices.buffer, message.normals.buffer]);

// app.js

onmessage = function (event) {

    var vertices = event.data.vertices;
    var normals = event.data.normals;

    var geometry = new THREE.BufferGeometry();
    geometry.addAttribute( 'position', new THREE.BufferAttribute( vertices, 3 ) );
    geometry.addAttribute( 'normal', new THREE.BufferAttribute( normals, 3 ) );

    var material = new THREE.MeshPhongMaterial();

    var mesh = new THREE.Mesh( geometry, material );

    // Do something with it.

};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Three.js - 如何反序列化geometry.toJSON()? (geometry.fromJSON 在哪里?) 的相关文章

随机推荐