THREE.JS 根据起始帧将一个AnimationClip对象分割成多个AnimationClip
因为从3dsMax里面导出的模型只支持一个动画,如果需要对多个动画进行单独控制的话就必须将其切割成多个AnimationClip对象,其实原理跟数组截取是一样的。
/**
*根据起始帧将当前动画切割成多段动画
* @param clips 起始帧数组[[起始帧,结束帧],[起始帧,结束帧]...]
* @returns {Array} 截取后的多段动画
*/
THREE.AnimationClip.prototype.slice = function (clips) {
var animations = [];
var startTime = 0;
var scope = this;
clips.forEach(function (clip, index) {
var tracks = [];
scope.tracks.forEach(function (track_s) {
var s = (track_s.constructor == THREE.VectorKeyframeTrack ? 3 : 4)
//按起始帧截取关键帧
var times = track_s.times.toArray().concat([]).slice(clip[0], clip[1] + 1);
var values = track_s.values.toArray().concat([]).slice(clip[0] * s, (clip[1] + 1) * s)
if (times.length == 0) {
times.push(0);
values = track_s.values.toArray().concat([]);
}
//减去上一段动画的结束时间,把起始时间归零
times.forEach(function (value, index) {
times[index] -= startTime;
});
var track;
if (track_s.constructor == THREE.VectorKeyframeTrack)
track = new THREE.VectorKeyframeTrack(track_s.name, times, values);
else if (track_s.constructor == THREE.QuaternionKeyframeTrack)
track = new THREE.QuaternionKeyframeTrack(track_s.name, times, values);
tracks.push(track);
});
var animation = new THREE.AnimationClip('Take_' + index, -1, tracks);
animations.push(animation);
startTime = animation.duration;
});
return animations;
}
Float32Array.prototype.toArray = function () {
var array = [];
for (var i = 0; i < this.length; i++)
array.push(this[i]);
return array;
}