2013-04-24 81 views
0

我COLLADA格式多模型(knight.dae & archer.dae)。 我的問題是,我不能讓他們都動畫(讓我們說空閒是2-3幀)。 當我加載場景,我不是隻有一次動畫模型和一個STIL模型(沒有動畫,什麼都沒有,就好像他是在3ds Max建模)。 我知道我的問題是與皮膚和變種,但我搜索了很多,並沒有找到答案,因爲我缺乏經驗我嘗試到目前爲止還沒有。 幫助請幫助!多個不同的Collada的場景three.js所動畫將無法工作

//animation length of the model is 150(and it hosts 4 different animations) 
var startFrame = 0, endFrame = 150, totalFrames = endFrame - startFrame, lastFrame; 
var urls = []; 
var characters = []; 
urls.push('3D/archer/archer.dae'); 
urls.push('3D/archer/archer.dae'); 
//here's the loader 
loader = new THREE.ColladaLoader(); 
     loader.options.convertUpAxis = true; 
     for (var i=0;i<urls.length;i++) {       
     loader.load(urls[i],function colladaReady(collada){ 
      player = collada.scene; 
      player.scale.x = player.scale.y = player.scale.z =10; 
      player.position.y=115; 
      player.position.z=i*200; 
      player.updateMatrix() 
      skin = collada.skins [ 0 ]; 
      //skinArray.push(skin);; 
     var mesh=new THREE.Mesh(new THREE.CubeGeometry(10,20,10,1,1,1)); 
     player.add(mesh); 
     characters.push(mesh); 
     scene.add(player); 
      }); 
     } 
//i added the cube because i use raycaster and it doesnt detect collada obj 


// Here is where i try my animation. 
     function animate() { 
     requestAnimationFrame(animate); 
     render(); 

    } 
     function render() { 
     update(); 
     renderer.render(scene,camera); 

    } 
    function update() { 
     var delta = clock.getDelta(); 
     delta = delta/2;  
     if (t > 1) t = 0; 
     if (skin) 
      { 
     skin.morphTargetInfluences[lastFrame] = 0; 
     var currentFrame = startFrame + Math.floor(t*totalFrames); 
     skin.morphTargetInfluences[currentFrame] = 1; 
     t += delta; 
     lastFrame = currentFrame; 
     } 
    } 

回答

0

嘗試是這樣的....開頭:

var skins = []; 

在你的COLLADA回調,有些東西你似乎已經有想過:

skins.push(collada.skins[0]); 

在你的渲染器,而不是現在的,如果(皮膚)子句:

t += delta; 
lastFrame = currentFrame; 
var currentFrame = startFrame + Math.floor(t*totalFrames); 

for (var i = 0; i < skins.length; i++) { 
    var skin = skins[i]; 
    if (skin) { 
    skin.morphTargetInfluences[lastFrame] = 0; 
    skin.morphTargetInfluences[currentFrame] = 1; 
    } 
} 

要點是,您需要循環update()函數中的所有外觀。我沒有很仔細地檢查幀處理代碼,因爲這是沒有問題的。如果你的皮膚有框架的不同金額,你需要採取那些考慮在你的代碼(也許讓lastFrame,設置currentFrame等變量數組匹配皮膚數組)。

+0

感謝您的答案,但偏偏它沒有工作,如果我用你的代碼我的型號變身怪(規模大,不正確的動畫效果)。 – user2247215 2013-04-25 11:37:48

0
 if (skinArray[0] && skinArray[1]) 
     { 
     skinArray[0].morphTargetInfluences[lastFrame] = 0; 
     skinArray[1].morphTargetInfluences[lastFrame] = 0; 
     var currentFrame = startFrame + Math.floor(t*totalFrames); 
     skinArray[0].morphTargetInfluences[currentFrame] = 1; 
     skinArray[1].morphTargetInfluences[currentFrame] = 1; 
     t += delta; 
     lastFrame = currentFrame; 
     } 

我想出了這個代碼,它的工作,但我只是不喜歡它,主要是因爲它覺得這是hardcoded.So如果任何你們能拿出一個更優雅的解決方案我」 d會更開心。