Collada从未在animate()中定义

时间:2019-01-05 09:19:51

标签: javascript asynchronous three.js

我正在尝试通过名为createObject的函数加载collada模型,并通过更改其在animate()函数中的位置来移动我的collada。

我尝试过的是声明一个var mario,然后调用init();。和animate();。 在init();中我调用函数createObject并进行动画处理,更改其位置,但是由于在if(mario!== undefined)中什么也没发生,因此从未定义对象。

var mario;
init();
animate();

在init()中:

createObject(mario,"dae/mario.dae",50,50,50,0,-28,0,0,0);

在animate()中:

requestAnimationFrame( animate );
if ( mario !== undefined ) {
    console.log("working!");
mario.position.z += 1;
}
render();
stats.update();

我的函数createObject():

function createObject(object,src,size1, size2, size3, posX,posY, posZ, rotation,audio){         
            // loading manager
            var loadingManager = new THREE.LoadingManager(function(){
                scene.add( object );
            });
            // collada
            var loader = new THREE.ColladaLoader( loadingManager );
            loader.load( src, function ( collada ) {
                object = collada.scene;
                object.scale.set(size1,size2,size3); 
                object.position.x = posX;
                object.position.y = posY;
                object.position.z = posZ;
                object.rotation.z = rotation;
                object.traverse(function (child) {

                    if (child instanceof THREE.Mesh) {
                        child.castShadow = true;
                        child.receiveShadow = true;
                    }
                });
                if(audio)
                       object.add(audio);                  
            });                             
        }

因此该对象已加载,但不会移动,console.log也不会打印任何内容。 有谁可以帮助我吗 ?

谢谢。

2 个答案:

答案 0 :(得分:0)

将模型分配给功能参数object不会将值分配给mario。建议您删除函数createObject()的第一个参数,并将collada.scene直接分配给全局变量mario。与本示例中的方法相同:

https://threejs.org/examples/webgl_loader_collada.html

答案 1 :(得分:0)

它可以通过init()来实现:

loader.load('dae/mario.dae', function ( collada ) {
                mario = collada.scene;
                setObject(mario,50,50,50,0,-28,0,0,0);
                scene.add( mario );
            } );

在我的函数setObject中,我只设置大小和位置等。

您是说对所有文件使用相同的onLoad()回调吗?