Three.js - Как десериализовать geometry.toJSON()? (где geometry.fromJSON?)

Я пытаюсь разгрузить некоторые Geometry загрузка и обработка в веб-работника. Чтобы отправить его обратно в основной поток, Geometry экземпляр должен быть сериализован, и кажется, что Geometry.prototype.toJSON() предназначался именно для этого типа вещей.

Но я не могу понять, как превратить этот объект обратно в Geometry экземпляр в главном потоке. Как toJSON() выход предполагается использовать?

PS: я видел этот связанный вопрос, но он кажется устаревшим. toJSON() еще не был в API Принятый ответ немного запутан и требует, чтобы я все еще делал некоторую грубую работу в главном потоке.

3 ответа

Если я правильно понимаю, проблема заключается в следующем:

  • У вас есть файл, который вы хотите загрузить в виде геометрии (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.

};

Ты можешь использовать 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;

Почему бы вам просто не использовать JSONLoader?

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

или загрузить файл JSON таким же образом

Другие вопросы по тегам