Экспорт только мешей, содержащихся в Object3Ds, в GLTF в Three.js

Я хорошо поохотился, но не могу найти решения:

GLTFExport для Three.js позволяет экспортировать определенные объекты, когда они названы в экспортере.

Моя ситуация:

У меня есть случайное количество объектов Object3D с дочерними сетками в моей сцене, которые я хотел бы экспортировать, однако я удалил из моей сцены все, кроме объектов и их дочерних сеток и помощника для отображения направления нормалей лица, и я все еще получаю Ошибка:

Uncaught Error: THREE.GLTFExporter: userData can't be serialized

Раньше у меня не было Object3D, и у меня были только меши в качестве дочерних элементов сцены, и экспорт работал нормально. К сожалению, для работы программы необходимо наличие сеток внутри объектов, и в документации предлагается их экспортировать.

Может ли кто-нибудь придумать способ обойти эту проблему?


person Josh Bowman    schedule 24.06.2018    source источник


Ответы (1)


userData - это поле в каждом Object3D, которое обычно имеет значение {}. Он предназначен для того, чтобы позволить пользователю (вам) хранить свои собственные данные в Object3D или производном классе, не нарушая при этом внутреннюю структуру объекта .. У вас может быть несколько .userData, установленных для object3D в вашей сцене ..

Самый простой способ узнать это scene.traverse((o)=>{console.log(o.userData)}) и посмотреть, хранятся ли userData на каком-либо из ваших объектов.

Вы можете сделать копию своей сцены перед экспортом, используя var sceneCopy = scene.clone (true);

затем sceneCopy.traverse((o)=>{o.userData={};});

а затем попробуйте экспортировать файл sceneCopy.

Попробуйте, и если это не сработает, попробуйте снова здесь :)

hth

person manthrax    schedule 24.06.2018
comment
БЛАГОДАРНОСТЬ! У меня есть userData .... Я знал, что где-то видел этот термин! Я попробую то решение, которое вы предлагаете, и дам вам знать! - person Josh Bowman; 24.06.2018
comment
У меня были проблемы с вашим кодом ... Я мог печатать на консоли и видеть объекты с userData, но когда я попытался воспроизвести повторяющуюся сцену, она, к сожалению, выдала ошибку :( three.min.js: 498 Uncaught RangeError: Maximum call stack size exceeded. Мне удалось удалить userData из исходных объектов, но это затем испортит любое дальнейшее взаимодействие с сетками в сцене .... - person Josh Bowman; 24.06.2018
comment
Превышение размера стека вызовов является ключом к разгадке проблемы. Похоже, что какая-то утилита или клиентский код поместил некоторые данные в userData, которые содержат циклическую ссылку или иным образом несериализуемы. Можете ли вы сообщить, что содержит userData об объектах, на которых вы их нашли? - person manthrax; 24.06.2018
comment
Ага. В моей сцене есть несколько мешей, по которым мне нужно найти родителей, когда на них щелкают. Я добавил userData.parent = parentObject, чтобы получить родительский объект, просто набрав arrayObject.parent (это было вызвано из переменной, определяющей первый объект, найденный в Raycaster) .... Я обнаружил, что проблема с размером стека вызовов возникает команде .clone. Я протестировал его, создав новую сцену экспортера, найдя каждый объект3D в массиве и затем клонировав Object3D. Как только команда clone нажата, я получаю сообщение об ошибке ..... кстати, я понятия не имею о сериализации - person Josh Bowman; 24.06.2018
comment
Ааааа ... как идиот, я только что понял, что мне не нужен этот .parent в качестве дополнения userData .... он уже там = _ =, я вынул его сейчас, я ' Я проведу еще несколько тестов и посмотрю, исправит ли это проблему. - person Josh Bowman; 24.06.2018
comment
Боже мой, это действительно сработало! Говорить ни о чем, черт возьми! Большое спасибо за вашу помощь в разборе этой проблемы, Мантракс, я полностью застрял перед вашими предложениями. - person Josh Bowman; 24.06.2018
comment
w00t! Рад, что смог помочь! Проголосуйте за мой ответ ... ах, вы приняли ... достаточно хорошо: P: D Да, есть метод для большинства ТРЕХ объектов, называемый .toJSON, который позволяет вам сериализовать объекты в JSON ... но когда он попадает в круговую ссылку, он взрывается . Затем вы можете взять полученный в результате BLOB-объект JSON и сохранить или перезагрузить его в сцену с помощью THREE.ObjectLoader (). Parse (или .load (я предполагаю, что экспортер GLTF использует аналогичный механизм, и поэтому он умер. userData в основном должна содержать простые объекты javascript, а не ссылки на другие данные, которые нельзя преобразовать в json. - person manthrax; 24.06.2018