static CreateFromMorphTargetSequence( name, morphTargetSequence, fps, noLoop ) {

		const numMorphTargets = morphTargetSequence.length;
		const tracks = [];

		for ( let i = 0; i < numMorphTargets; i ++ ) {

			let times = [];
			let values = [];

			times.push(
				( i + numMorphTargets - 1 ) % numMorphTargets,
				i,
				( i + 1 ) % numMorphTargets );

			values.push( 0, 1, 0 );

			const order = getKeyframeOrder( times );
			times = sortedArray( times, 1, order );
			values = sortedArray( values, 1, order );

			// if there is a key at the first frame, duplicate it as the
			// last frame as well for perfect loop.
			if ( ! noLoop && times[ 0 ] === 0 ) {

				times.push( numMorphTargets );
				values.push( values[ 0 ] );

			}

			tracks.push(
				new NumberKeyframeTrack(
					'.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']',
					times, values
				).scale( 1.0 / fps ) );

		}

		return new this( name, -1, tracks );

	}
Returns a new animation clip from the passed morph targets array of a
geometry, taking a name and the number of frames per second.

Note: The fps parameter is required, but the animation speed can be
overridden via {@link AnimationAction#setDuration}.

@static
@param {string} name - The name of the animation clip.
@param {Array<Object>} morphTargetSequence - A sequence of morph targets.
@param {number} fps - The Frames-Per-Second value.
@param {boolean} noLoop - Whether the clip should be no loop or not.
@return {AnimationClip} The new animation clip.