Threejs fbx loader将对象添加到场景中,但我不在子数组中

时间:2019-03-02 14:45:32

标签: three.js camera loader fbx

按照threejs.org FBX加载器示例,我使用以下功能加载了模型:

this.obj = null;

var loader = new THREE.FBXLoader();
var objs = []

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

    console.log("pushing to objs...");
    objs.push(object);
    console.log(objs[0]);

    object.traverse( function ( child ) {
        if ( child.isMesh ) {
        //console.log(child)

        //console.log(child.material.length)

        const oldMat = child.material;
        var newMat = new THREE.MeshBasicMaterial();

        // if(oldMat.length == undefined)
        // {
        //     console.log(newMat.copy(oldMat));

        //     child.material = newMat;

        //     child.material = new THREE.MeshBasicMaterial( {  
        //     color: oldMat.color,
        //     } );
        // }
        // else
        // {
        //     for(var i = 0; i < oldMat.length; i++)
        //     {
        //         child.material[i] = new THREE.MeshBasicMaterial( {  
        //         color: oldMat[i].color,
        //         } );
        //     }
            // }
        }
    } );

    object.position.z -= 200;
    object.position.y -= 250;
    var action = mixer.clipAction( object.animations[ 0 ] );
    action.play();
    scene.add( object );
} 

var true_load = load_init.bind(this);
console.log("printing objects...");
loader.load( 'Anims/Capoeira.fbx', true_load);

console.log(objs);//seems to have things there
console.log(objs[0]);//prints undefined

这将成功添加对象,并且我可以看到动画播放。 问题是:我需要访问加载到场景中的对象并弄乱它的变量(主要是材质阴影和颜色)。 当我做console.log(scene.children)时,我可以看到它打印了所有孩子。总共有4个(一个灯,一个地面,一个网格助手和一个加载的对象)。但是,当我打印长度时,它只会说有3个对象,如果我尝试直接通过children数组或通过按ID或名称获取对象来访问已加载的对象,我将无法定义。我还尝试过更改该函数以返回已加载的对象,甚至设置了一个名为loaded_object的变量,但我也将保留该函数。

1 个答案:

答案 0 :(得分:0)

请考虑使用THREE.LoadingManager。这些问题很可能归因于loader.load方法的异步性质。

THREE.LoadingManager.onLoad方法中,您应该能够正确访问所有内容。