В библиотеке Three.js работа с трехмерными сценами
включает возможность сохранения и восстановления их состояния. Для этих
целей используется класс
THREE.ObjectLoader, предназначенный для
сериализации (преобразования объектов сцены в JSON) и
десериализации (восстановления объектов из JSON). Этот
процесс необходим для передачи сцен по сети, сохранения конфигураций, а
также для динамического построения сцены из внешних источников.
ObjectLoader позволяет:
Схема работы:
scene.toJSON().ObjectLoader.parse(json) или загружается через
ObjectLoader.load(url, onLoad).Сериализация сцены выполняется методом
toJSON(), который доступен у всех
объектов, наследующихся от THREE.Object3D.
Пример:
import * as THREE from 'three';
const scene = new THREE.Scene();
const geometry = new THREE.BoxGeometry(1, 1, 1);
const material = new THREE.MeshStandardMaterial({ color: 0x00ff00 });
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);
const json = scene.toJSON();
console.log(JSON.stringify(json, null, 2));
Особенности:
THREE.MaterialLoader и
THREE.TextureLoader, но ObjectLoader
автоматически сериализует большинство стандартных материалов.Для восстановления сцены используется
THREE.ObjectLoader. Он может работать с
локальными объектами JSON или загружать их по URL.
Пример десериализации из JSON:
import * as THREE from 'three';
const loader = new THREE.ObjectLoader();
const sceneJson = /* JSON из предыдущего примера */;
const loadedScene = loader.parse(sceneJson);
console.log(loadedScene); // Восстановленная сцена с кубом
Пример загрузки JSON по URL:
loader.load('scene.json', function(loadedScene) {
console.log('Сцена загружена', loadedScene);
});
Особенности:
ObjectLoader через
loader.setCustomObjectLoader(name, callback).Three.js позволяет создавать классы, наследующиеся от
THREE.Object3D. Для корректной сериализации и
десериализации таких объектов используется регистрация кастомного
обработчика.
class CustomCube extends THREE.Mesh {
constructor() {
super(new THREE.BoxGeometry(1, 1, 1), new THREE.MeshStandardMaterial({ color: 0xff0000 }));
}
toJSON(meta) {
const data = super.toJSON(meta);
data.userData.customFlag = true;
return data;
}
}
const loader = new THREE.ObjectLoader();
loader.setCustomObjectLoader('CustomCube', function(data) {
const obj = new CustomCube();
obj.userData = data.userData;
return obj;
});
При сериализации ObjectLoader автоматически сохраняет
свойства материалов и текстур. Однако есть нюансы:
image.src).ShaderMaterial) требуют ручной
сериализации пользовательских uniform-параметров.ObjectLoader.load().object.toJSON(meta) с
пользовательским meta.userData.version) для совместимости при изменении
структуры объектов.parse(json) — десериализация
объекта/сцены из JSON.load(url, onLoad, onProgress, onError)
— загрузка JSON-файла по URL.setCustomObjectLoader(type, callback)
— регистрация кастомного обработчика для нестандартных объектов.setTexturePath(path) — базовый путь
для текстур, если они сериализованы как пути к файлам.Эти методы позволяют гибко управлять сценой, восстанавливать сложные иерархии объектов и интегрировать кастомные элементы без потери информации.
Использование ObjectLoader позволяет создавать
масштабируемые приложения с трехмерной графикой, где сцена может быть
легко сохранена, передана и восстановлена без потери структуры и
материалов.