2013-04-24 2 views
0

У меня есть несколько моделей в формате Collada (knight.dae & archer.dae). Моя проблема в том, что я не могу заставить их всех анимировать (скажем, Idle with is 2-3frames). Когда я загружаю сцену, я получаю только одну анимированную модель и одну стильную модель (без анимации, ничего нет, это похоже на то, что он моделируется в 3ds max). Я знаю, что моя проблема связана с кожей и морфами, но я искал много и не нашел ответа, и из-за моего отсутствия опыта мои попытки потерпели неудачу. Помощь pls!Несколько разных сцен 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

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, если любой из вас, ребята могут придумать более элегантное решение я» быть более счастливым.

Смежные вопросы