HREE.JS 根据起始帧将一个AnimationClip对象分割成多个AnimationClip

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;
}

猜你喜欢

转载自blog.csdn.net/qq_21222737/article/details/83620609
今日推荐