Three.js Неперехваченная ошибка типа: не удается прочитать свойство ‘0’ неопределенного значения при загрузке 3D-объекта

#json #animation #three.js #loading

#json #Анимация #three.js #Загрузка

Вопрос:

     ob = JSON.stringify( that.char_elements[0].anim_manager.anim_list[0].obj.toJSON(), null, 3 );
    require("fs").writeFile( "./src/data/obj.pr", ob , 'utf8', function(err) {
        console.log(err);
    });
  

Вот как я пишу .файл json, который будет загружен позже. И, похоже, у него не возникает никаких проблем с импортом, поскольку результирующий файл имеет этот формат:

 {
   "metadata": {
      "version": 4.5,
      "type": "Object",
      "generator": "Object3D.toJSON"
   },
   "geometries": [
      {
         "uuid": "447BF091-8882-4377-97C0-6E5102476B59",
         "type": "BufferGeometry",
         "name": "pCylinder2.000",
         "data": {...
  

Но когда я пытаюсь загрузить его позже, используя ТРИ.ObjectLoader, я получаю эту странную ошибку из заголовка этого фрагмента кода, когда пытаюсь загрузить его таким образом:

     var f2 = require('fs').readFileSync("./src/data/project.pr", 'utf8', function(err) {
        console.log(err);
    });

    char.anim_manager.loader_helper.js_loader.load( f2, char.anim_manager.loader_helper.true_load);
// gives this error: Three.js Uncaught TypeError: Cannot read property '0' of 
// undefined when loading 3D object...at XMLHttpRequest.<anonymous> (three.js:34342)
  

Функция загрузки:

     function load_init( anim ) {
    viewer.mixer = new THREE.AnimationMixer( anim );

    if(viewer.cur_anim)
        viewer.scene.remove(viewer.cur_anim);

    cur_anim.anim = anim;
    viewer.cur_anim = cur_anim.anim;

    var that = this;
    anim.name = "animation_name";

    var mat_dict = {};

    anim.traverse( function ( child ) {
        if ( child.isMesh ) {

            //anim.mat_manager.mat_list
            const oldMat = child.material;

            if(oldMat.length == undefined)//only one material in the mesh
            {
                if(!mat_dict[oldMat.name])
                {
                    child.material = new THREE.MeshToonMaterial( {  
                        color: oldMat.color,
                        skinning: true,
                        name: oldMat.name,
                        side: THREE.DoubleSide,
                        shininess: 0,
                        specular: 0,
                        reflectivity: 0,
                    } ); 

                    mat_dict[oldMat.name] = child.material;
                    cur_anim.mat_manager.mat_list.push(child.material);
                }
                else
                    child.material = mat_dict[oldMat.name];
            }
            else//multiple materials
            {
                for(var i = 0; i < oldMat.length; i  )
                {
                    if(!mat_dict[oldMat[i].name])
                    {
                        child.material[i] = new THREE.MeshToonMaterial( {  
                        color: oldMat[i].color,
                        skinning: true,
                        name: oldMat[i].name,
                        side: THREE.DoubleSide,
                        shininess: 0,
                        specular: 0,
                        reflectivity: 0,
                        } );

                        mat_dict[oldMat[i].name] = child.material[i];
                        cur_anim.mat_manager.mat_list.push(child.material[i]);
                    }
                    else
                        child.material[i] = mat_dict[oldMat[i].name];
                }
            }
        }
    } );

    var action = viewer.mixer.clipAction( anim.animations[ 0 ] );
    action.play();

    viewer.scene.add( cur_anim.anim );
} 
  

Но я использую привязку, чтобы избежать использования этой ошибки. Это называется true_load

 var true_load = load_init.bind(this);
  

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

1. Не могли бы вы, пожалуйста, предоставить общий доступ ко всему вашему файлу JSON?

2. Извините за задержку. Вот файл: mediafire.com/file/h1mhyv9sydida65/obj.pr/file

3.Я смог загрузить вашу модель JSON в three.js редактор. Результат выглядит следующим образом: imgur.com/a/BUqbano . Похоже, THREE.ObjectLoader он может загрузить ваш файл. Вероятно, вы делаете что-то не так в своем приложении. Не могли бы вы продемонстрировать на живом примере, как вы загружаете файл?

4. Я не могу сказать вам точно , как я это делаю, потому что я забыл нажать на git (все функции загрузки соответствуют моей версии), и я нахожусь на своем рабочем месте, поэтому нет доступа к этому компьютеру. Но в принципе, у меня есть вспомогательный загрузчик ‘class’ для управления загрузкой за меня. Когда я нажимаю кнопку, json будет сохранен точно так же, как вы видели это в OP. Как только я нажму на кнопку загрузить, он прочитает файл, как вы видите в OP. В диспетчере анимации (куда я помещаю всех персонажей и анимации) я вызову загрузку оттуда (будь то FBX или что-то еще), как вы это видите там. Но истинная загрузка выглядит следующим образом:

5. Извините за отсутствие js.fiddle, но я действительно не знаю, как его использовать, и прямо сейчас я не могу остановиться, чтобы взглянуть на него. Функция, которую я использую, находится в OP