animation/tracks/AnimationMixer.js
//修改后
// advance the time and update apply the animation
update: function ( deltaTime ,myTrackIndex) {
deltaTime *= this.timeScale;
const actions = this._actions,
nActions = this._nActiveActions,
time = this.time += deltaTime,
timeDirection = Math.sign( deltaTime ),
accuIndex = this._accuIndex ^= 1;//0变1 1变0
// a=b^=k 表示a和b均变为b对应数据二进制的异或
// run active actions
for ( let i = 0; i !== nActions; ++ i ) {
const action = actions[ i ];
action._update( time, deltaTime, timeDirection, accuIndex );
}
// update scene graph
const bindings = this._bindings,
nBindings = this._nActiveBindings;
if(typeof (myTrackIndex)==="undefined"){//使用固定的track
//nBindings是动画轨迹track的个数
for ( let i = 0; i !== nBindings; ++ i ) {
bindings[ i ].apply( accuIndex );
//accuIndex似乎是0和1的交替
}
}else{
for(var k=0;k< myTrackIndex.length;k++){
var index=myTrackIndex[k];
bindings[index].apply( accuIndex );
}
}
return this;
}
使用方法
//设置动画头部动画
var arr1=[9,10,11,12];
var arr2=[];
var arr0=arr1;
for(var i1=0;i1<glb.animations[0].tracks.length;i1++){
for(var i2=0;i2<arr0.length;i2++)
if(arr0[i2]===i1)break;
if(i2===arr0.length)
arr2.push(i1)
}
var mixer1 = new AnimationMixer(glb.scene);
mixer1.clipAction(glb.animations[1]).play();
setInterval(()=>mixer1.update(0.01,arr1),10)
var mixer2 = new AnimationMixer(glb.scene);
mixer2.clipAction(glb.animations[2]).play();
setInterval(()=>mixer.update(0.01,arr2),10)