buildCameraAnimation( vmd ) {

			function pushVector3( array, vec ) {

				array.push( vec.x );
				array.push( vec.y );
				array.push( vec.z );

			}

			function pushQuaternion( array, q ) {

				array.push( q.x );
				array.push( q.y );
				array.push( q.z );
				array.push( q.w );

			}

			function pushInterpolation( array, interpolation, index ) {

				array.push( interpolation[ index * 4 + 0 ] / 127 ); // x1

				array.push( interpolation[ index * 4 + 1 ] / 127 ); // x2

				array.push( interpolation[ index * 4 + 2 ] / 127 ); // y1

				array.push( interpolation[ index * 4 + 3 ] / 127 ); // y2

			}

			const cameras = vmd.cameras === undefined ? [] : vmd.cameras.slice();
			cameras.sort( function ( a, b ) {

				return a.frameNum - b.frameNum;

			} );
			const times = [];
			const centers = [];
			const quaternions = [];
			const positions = [];
			const fovs = [];
			const cInterpolations = [];
			const qInterpolations = [];
			const pInterpolations = [];
			const fInterpolations = [];
			const quaternion = new THREE.Quaternion();
			const euler = new THREE.Euler();
			const position = new THREE.Vector3();
			const center = new THREE.Vector3();

			for ( let i = 0, il = cameras.length; i < il; i ++ ) {

				const motion = cameras[ i ];
				const time = motion.frameNum / 30;
				const pos = motion.position;
				const rot = motion.rotation;
				const distance = motion.distance;
				const fov = motion.fov;
				const interpolation = motion.interpolation;
				times.push( time );
				position.set( 0, 0, - distance );
				center.set( pos[ 0 ], pos[ 1 ], pos[ 2 ] );
				euler.set( - rot[ 0 ], - rot[ 1 ], - rot[ 2 ] );
				quaternion.setFromEuler( euler );
				position.add( center );
				position.applyQuaternion( quaternion );
				pushVector3( centers, center );
				pushQuaternion( quaternions, quaternion );
				pushVector3( positions, position );
				fovs.push( fov );

				for ( let j = 0; j < 3; j ++ ) {

					pushInterpolation( cInterpolations, interpolation, j );

				}

				pushInterpolation( qInterpolations, interpolation, 3 ); // use the same parameter for x, y, z axis.

				for ( let j = 0; j < 3; j ++ ) {

					pushInterpolation( pInterpolations, interpolation, 4 );

				}

				pushInterpolation( fInterpolations, interpolation, 5 );

			}

			const tracks = []; // I expect an object whose name 'target' exists under THREE.Camera

			tracks.push( this._createTrack( 'target.position', THREE.VectorKeyframeTrack, times, centers, cInterpolations ) );
			tracks.push( this._createTrack( '.quaternion', THREE.QuaternionKeyframeTrack, times, quaternions, qInterpolations ) );
			tracks.push( this._createTrack( '.position', THREE.VectorKeyframeTrack, times, positions, pInterpolations ) );
			tracks.push( this._createTrack( '.fov', THREE.NumberKeyframeTrack, times, fovs, fInterpolations ) );
			return new THREE.AnimationClip( '', - 1, tracks );

		}
@param {Object} vmd - parsed VMD data
@return {AnimationClip}