2017-02-22 8 views
0

Я сделал анимированные сетки в Blender, содержащие две анимации клипов, которые я назвал интро и простоя. Я экспортирую его с экспортером Blender в JSON. Все отлично работает. Я могу переключить ту анимацию, которую хочу играть. Моя проблема в том, что я хочу полностью воспроизвести первую анимацию , а затем переключиться на вторую анимацию, которую я настрою на цикл.проверить, когда clipAction анимация закончила играть в three.js

Вот части кода я использую для JSON и анимационной части:

var jsonLoader = new THREE.JSONLoader(); 
    jsonLoader.load('models/feuille(19fevrier).json', 
    function (geometry, materials) { 

     mesh = new THREE.SkinnedMesh(geometry, 
      new THREE.MeshLambertMaterial({ 
      skinning: true 
     })); 

     mixer = new THREE.AnimationMixer(mesh); 

     action.intro = mixer.clipAction(geometry.animations[ 0 ]); 
     action.idle = mixer.clipAction(geometry.animations[ 1 ]); 

     action.intro.setEffectiveWeight(1); 
     action.idle.setEffectiveWeight(1); 
     action.intro.enabled = true; 
     action.idle.enabled = true; 

     action.intro.setLoop(THREE.LoopOnce, 0); 


     scene.add(mesh); 

     scene.traverse(function(children){ 
      objects.push(children); 
     }); 

     action.intro.play(); 

    }); 

То, что я искал это функция, которая говорит мне, что действие завершено, нечто подобное OnComplete событие когда clipAction закончил игру. Я нашел ответ на three.js GitHub:

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

    // some code 

}); 

Это, кажется, работает, но я действительно не понять addEventListener в этом контексте и ни какие function(e) средства.

Существует звено the code I found on GitHub

ответ

0

addEventListener является частью стандартного JavaScript dispatchEvent/addEventListener concept для обработки событий. Подсистема анимации three.js отправляет событие всякий раз, когда анимация завершается. От AnimationAction.js:

this._mixer.dispatchEvent({ 
    type: 'finished', action: this, 
    direction: deltaTime < 0 ? -1 : 1 
}); 

Как можно видеть, e аргумент событие предоставляет полный AnimationAction объекта (e.action), а также целое число, представляющее направление анимации (e.direction).

Не чувствуйте себя обескураженным из-за того, что это недокументированное поведение (три. Js росли намного быстрее, чем г-н Дуб мог когда-либо правильно документировать). Используйте доступные функции, но следите за возможными изменениями в выпусках функций.

+0

Прежде всего, спасибо за быстрое реагирование. Я лучше понимаю концепцию addEventListener. Я попытался использовать код в своем скрипте, но у меня нет никакого результата. Может быть, это синтаксическая ошибка? Там код, который я пытался использовать: \t \t \t 'mesh.mixer.addEventListener ('закончил', функция (e.action.intro) {' \t \t \t 'action.idle.play(); ' \t \t \t'}); ' – larsenhupin

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