Three.js Uncaught TypeError: Невозможно прочитать свойство '0' из неопределенного при загрузке 3D-объекта - PullRequest
0 голосов
/ 19 марта 2019
    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": {...

Но когда я пытаюсь загрузить его позже, используя THREE.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 );
} 

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

var true_load = load_init.bind(this);
...