Как я могу хранить отличительные знаки в Three.js и загрузить их?

#three.js

#three.js

Вопрос:

У меня есть модель, которая, когда я нажимаю на грани, добавляет отличительные знаки (точки или метки на грани), интересно, как я могу сохранить выделение и загрузить его позже.

Я последовал приведенному здесь примеру, и это функция, которая сохраняет наклейку в массиве

     function shoot() {

        position.copy( intersection.point );
        orientation.copy( mouseHelper.rotation );

        if ( params.rotate ) orientation.z = Math.random() * 2 * Math.PI;

        var scale = params.minScale   Math.random() * ( params.maxScale - params.minScale );
        size.set( scale, scale, scale );

        var material = decalMaterial.clone();
        material.color.setHex( 0xffffff );

        var m = new THREE.Mesh( new DecalGeometry( mesh, position, orientation, size ), material );

        decals.push( m );
        scene.add( m );

    }
  

Итак, я попытался сохранить массив отличительных знаков, а когда сцена загружается — добавить их в сцену

 scene.add( decals ); // just an idea
  

Я также прибегаю к этому примеру — но все же — я не мог понять, как это сделать.

Ответ №1:

Поскольку декали — это просто сетки, вы можете сериализовать их с Object3D.toJSON() помощью и восстановить их с помощью ObjectLoader . Я обновил вашу скрипку, чтобы продемонстрировать этот подход. Соответствующий код:

 const jsonString = JSON.stringify( scene.toJSON() );
scene = new THREE.ObjectLoader().parse( JSON.parse( jsonString ) );
  

Когда объект сцены будет восстановлен, наклейки все еще должны быть там. Единственное, что исчезает, — это помощник axes (поскольку помощники еще не могут быть сериализованы / десериализованы).

Комментарии:

1. Спасибо — я думаю, что-то не так с сериализацией jsonString — быть причиной — когда я сохраняю его (например, в localStorage), он сломан — вам удалось перезагрузить его?