2016-06-26 11 views
10

ミキサーシステムはr73に導入されました。それ以来、私はこの新しいシステムにゲームをアップデートしようとしていました。Three.jsスケルトンアニメーションを新しいミキサーベースのシステムに更新する

私はそこには1つのことを除いて全然ありません。特定のジオメトリを持つアニメーションのクロスフェードは、r72には存在しなかったわずかな遅れがあります。私はr72のBlendCharacterとAnimation関数をハックしてコールバックを許可しました。 73では、この機能がイベントトリガーを介して組み込まれているため、これは必要ではありませんでした。

以下のフィドルでは、すべてが意図どおりに機能します(r72)。

http://jsfiddle.net/titansoftime/a93w5hw0/

<script src="http://www.titansoftime.com/webgl/Three72.full.js"></script> 
<script src="http://www.titansoftime.com/webgl/BlendCharacter2.js"></script> 
<script src="https://rawgit.com/mrdoob/three.js/dev/examples/js/loaders/DDSLoader.js"></script> 

var scene, camera, renderer, ambient, directional; 
var mesh, geoCache={}; 
var clock, jsLoader, ddsLoader; 

init(); 
animate(); 

function init() { 

     scene = new THREE.Scene(); 

     camera = new THREE.PerspectiveCamera(45, window.innerWidth/window.innerHeight, 1, 10000); 
     camera.position.z = 20; 
     camera.position.y = 10; 

     ambient = new THREE.AmbientLight(0xffffff);  
     scene.add(ambient); 

     directional = new THREE.DirectionalLight(0xffffff,1); 
     directional.position.set(1,1,0); 
     scene.add(directional); 

     clock = new THREE.Clock(); 

     jsLoader = new THREE.JSONLoader(true);  
     ddsLoader = new THREE.DDSLoader(); 

     renderer = new THREE.WebGLRenderer({antialias:true}); 
     renderer.setSize(window.innerWidth, window.innerHeight); 
     renderer.setClearColor(0xffffff, 1); 

     document.getElementById('idle').onclick = function(e){ 
      play('Idle',true); 
     }; 

     document.getElementById('run').onclick = function(e){ 
      play('Run',true); 
     }; 

     document.getElementById('melee').onclick = function(e){ 
      play('MelleAttack'); 
     }; 

     document.getElementById('magic').onclick = function(e){ 
      play('MagicAttack'); 
     };  

     document.body.appendChild(renderer.domElement); 

     loadFloor(); 

     loadModel(); 

} 

function createModel(json){ 

     var geo, geo2; 

     if(geoCache[json.name]){ 

       geo = geoCache[json.name]; 

     }else{ 

       geo2 = jsLoader.parse(json).geometry; 

       var m = new THREE.SkinnedMesh(geo2); 
       m.normalizeSkinWeights(); 
       geo2 = m.geometry; 

       geo = new THREE.BufferGeometry().fromGeometry(geo2); 
       geo.bones = geo2.bones; 
       geo.animations = geo2.animations; 

       geoCache[json.name] = geo; 

     } 

     var tex = ddsLoader.load('http://www.titansoftime.com/utils.php?task=getTexture&id=16'); 

     var mat = new THREE.MeshPhongMaterial({map:tex,skinning:true,side:THREE.DoubleSide}); 

     mesh = new THREE.BlendCharacter(); 
     mesh.load(geo,mat); 

     //mesh.scale.set(10,10,10); 

     //mesh.mixer = new THREE.AnimationMixer(mesh); 

     //parseAnimations();  

     scene.add(mesh); 

     play('Idle',true); 

     camera.lookAt(new THREE.Vector3(mesh.position.x,7,mesh.position.z)); 

} 

function loadModel(){ 

     $.ajax({ 

       url: 'http://www.titansoftime.com/utils.php', 
       data: 'task=getModel&id=16', 
       crossDomain: true, 
       type: 'POST', 
       success: function(response){ 
         createModel(JSON.parse(response)); 
       } 

     });  

} 

function loadFloor(){ 

     var geo = new THREE.PlaneBufferGeometry(50,50); 

     geo.applyMatrix(new THREE.Matrix4().makeRotationX(-Math.PI/2)); 

     var mat = new THREE.MeshBasicMaterial({color:0x0000ff}); 

     var mesh = new THREE.Mesh(geo,mat); 

     scene.add(mesh); 

} 

function play(name,loop){ 

    loop = loop || false; 

    var anim = mesh.animations[name]; 

    anim.loop = loop; 

    if(mesh.currentAnimation){ 

     var cur = mesh.animations[mesh.currentAnimation]; 

     var theTime = 0.175;     

     if(!cur.loop){ 

      var diff = cur.data.length - cur.currentTime; 

      theTime = Math.max(0,Math.min(theTime,diff)); 

     } 

     console.log('blending: '+name); 
     mesh.crossfade(name,theTime,function(){ 

      play('Idle',true) 

     }); 

    }else{    
     console.log('playing: '+name); 
     mesh.play(name,loop); 
    } 

} 

function animate() { 

     requestAnimationFrame(animate); 

     var delta = clock.getDelta(); 

     if(mesh){ 

       mesh.update(delta); 

     } 

     THREE.AnimationHandler.update(delta); 

     renderer.render(scene, camera); 

} 

この1(R78)は、一つのアニメーション(魔法攻撃力)を除いて、ほぼ正常に動作しますアイドルアニメーションに戻る前に小さいが顕著な遅延があります。他のモデルではそれはMeleeアニメーションですが、いくつかの場合はまったく問題ありません。スーパー混乱し、それらのすべてが72

http://jsfiddle.net/titansoftime/2sh95etj/

<script src="https://rawgit.com/mrdoob/three.js/master/build/three.min.js"></script> 
<script src="https://rawgit.com/mrdoob/three.js/master/examples/js/loaders/DDSLoader.js"></script> 

var scene, camera, renderer, ambient, directional; 
var mesh, geoCache={}; 
var clock, jsLoader, ddsLoader; 

init(); 
animate(); 

function init() { 

     scene = new THREE.Scene(); 

     camera = new THREE.PerspectiveCamera(45, window.innerWidth/window.innerHeight, 1, 10000); 
     camera.position.z = 20; 
     camera.position.y = 10; 

     ambient = new THREE.AmbientLight(0xffffff);  
     scene.add(ambient); 

     directional = new THREE.DirectionalLight(0xffffff,1); 
     directional.position.set(1,1,0); 
     scene.add(directional); 

     clock = new THREE.Clock(); 

     jsLoader = new THREE.JSONLoader(true);  
     ddsLoader = new THREE.DDSLoader(); 

     renderer = new THREE.WebGLRenderer({antialias:true}); 
     renderer.setSize(window.innerWidth, window.innerHeight); 
     renderer.setClearColor(0xffffff, 1); 

     document.getElementById('idle').onclick = function(e){ 
      play('Idle',true); 
     }; 

     document.getElementById('run').onclick = function(e){ 
      play('Run',true); 
     }; 

     document.getElementById('melee').onclick = function(e){ 
      play('MelleAttack'); 
     }; 

     document.getElementById('magic').onclick = function(e){ 
      play('MagicAttack'); 
     };  

     document.body.appendChild(renderer.domElement); 

     loadFloor(); 

     loadModel(); 

} 

function createModel(json){ 

     var geo, geo2; 

     if(geoCache[json.name]){ 

       geo = geoCache[json.name]; 

     }else{ 

       geo2 = jsLoader.parse(json).geometry; 

       var m = new THREE.SkinnedMesh(geo2); 
       m.normalizeSkinWeights(); 
       geo2 = m.geometry; 

       geo = new THREE.BufferGeometry().fromGeometry(geo2); 
       geo.bones = geo2.bones; 
       geo.animations = geo2.animations; 

       geoCache[json.name] = geo; 

     } 

     var tex = ddsLoader.load('http://www.titansoftime.com/utils.php?task=getTexture&id=16'); 

     var mat = new THREE.MeshPhongMaterial({map:tex,skinning:true,side:THREE.DoubleSide}); 

     mesh = new THREE.SkinnedMesh(geo,mat); 

     //mesh.scale.set(10,10,10); 

     mesh.mixer = new THREE.AnimationMixer(mesh); 

     parseAnimations(); 

     play('Idle',true); 

     scene.add(mesh); 

     camera.lookAt(new THREE.Vector3(mesh.position.x,7,mesh.position.z)); 

} 

function loadModel(){ 

     $.ajax({ 

       url: 'http://www.titansoftime.com/utils.php', 
       data: 'task=getModel&id=16', 
       crossDomain: true, 
       type: 'POST', 
       success: function(response){ 
         createModel(JSON.parse(response)); 
       } 

     });  

} 

function loadFloor(){ 

     var geo = new THREE.PlaneBufferGeometry(50,50); 

     geo.applyMatrix(new THREE.Matrix4().makeRotationX(-Math.PI/2)); 

     var mat = new THREE.MeshBasicMaterial({color:0x0000ff}); 

     var mesh = new THREE.Mesh(geo,mat); 

     scene.add(mesh); 

} 

function play(name,loop){ 

    var to = mesh.animations[ name ];  

    if(mesh.currentAnimation){ 

     var from = mesh.animations[ mesh.currentAnimation ]; 

     to.reset(); 

     if(loop){ 

      to.setLoop(THREE.LoopRepeat); 
      to.clampWhenFinished = false; 

     }else{ 

      to.setLoop(THREE.LoopOnce, 0); 
      to.clampWhenFinished = true;      

      mesh.mixer.addEventListener('finished',function(e){ 

       play('Idle',true); 

      });      

     } 

     from.play(); 
     to.play(); 

     from.enabled = true; 
     to.enabled = true; 

     from.crossFadeTo(to, 0.3);      

    }else{ 

     to.play(); 

    } 

    mesh.currentAnimation = name; 

} 

function parseAnimations(){ 

    var o, anim, anims = {}; 

    console.log(mesh); 

    for(var i=0,len=mesh.geometry.animations.length;i<len;i++){ 

     o = mesh.geometry.animations[i]; 
     if(o){ 

      anim = mesh.mixer.clipAction(o,mesh); 
      anim.setEffectiveWeight(1); 

      anims[o.name] = anim; 

     } 

    } 

    mesh.animations = anims; 

} 

function animate() { 

     requestAnimationFrame(animate); 

     var delta = clock.getDelta(); 

     if(mesh){ 

      if(mesh.mixer){ 

       mesh.mixer.update(delta); 

      } 

     } 

     renderer.render(scene, camera); 

} 

で正しく動作として、なぜこの出来事はありますか?

更新日:私はこれがアニメーション間のブレンドに限定されないことに気付きました。今ループしている私のアニメーションの1つに遅延があります!

72:http://jsfiddle.net/titansoftime/8v0pasp5/

78:何が起こっているかhttp://jsfiddle.net/titansoftime/n6apnj3z/

!削除された72の行に沿って何らかの自動修正動作や何かがあったのでしょうか?

+0

あなたがリンクしている79devフィドルは私のためには機能しません。 JS "JSONLoader.parse()"と何らかの関係があるようなエラーがプロパティを読み取れません。私もJSONがバージョン3であることに気付きました.3.js jsonフォーマットの新しいバージョンはありませんか? – 2pha

+0

彼らは79devへの最近のプッシュで何かを壊したにちがいないでしょう、私はそれを78に設定しました。彼らはより新しいjson spec yesを持っていますが、輸出者はまだそれを使用していません。この場合、jsonファイルの書式設定は完全に関連しているとは言えません.Jsonローダは仕様3用に構築されています。devの中断について知っていただきありがとうございます。 – Hobbes

+0

セーリング船の新しい仲間は私のためにうまくいくようです。 – 2pha

答えて

関連する問題