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

mhe*_*ens 7 javascript serialization deserialization three.js

我正在尝试将一些Geometry加载和处理卸载到Web worker中.要将它发送回主线程,Geometry实例需要被序列化,并且它似乎Geometry.prototype.toJSON()就是针对这种类型的事情.

但我无法弄清楚如何将该对象转回Geometry主线程中的实例.如何使用toJSON()输出?

PS:我看过这个相关的问题,但似乎过时了.toJSON()尚未进入API.接受的答案有点令人费解,并且要求我仍然在主线程中做一些原始工作.

Dyl*_*ann 5

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

  • 您有一个要作为几何图形(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]);
Run Code Online (Sandbox Code Playgroud)
// 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.

};
Run Code Online (Sandbox Code Playgroud)


ada*_*187 5

您可以JSONLoader像这样使用反序列化几何体:

var geometry = new THREE.Geometry();
var serializedGeometry = geometry.toJSON();
var jsonLoader = new THREE.JSONLoader();

var result = jsonLoader.parse(serializedGeometry.data);

var unserializedGeometry = result.geometry;
Run Code Online (Sandbox Code Playgroud)


小智 3

为什么不直接使用 JSONLoader 呢?

myloader = new THREE.JSONLoader()
myloader.load("path/to/json", function(geometry,material){
    mesh = new THREE.Mesh(geometry,material)
    scene.add(mesh)
})
Run Code Online (Sandbox Code Playgroud)

或以同样的方式加载 JSON 文件