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 таким же образом