#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), он сломан — вам удалось перезагрузить его?