每个AnimationClip通常保存对象的某个活动的数据;每个动画属性的数据都存储在单独的KeyFrameTrack中;存储的数据形式仅仅是动画的基础-实际播放是由AnimationMixer动画混合器控制的;动画混合器本身只有很少的(一般的)属性和方法,因为它可以由AnimationAction操作控制;如果希望一组对象接收共享的动画状态,则可以使用AnimationObjectGroup
构造函数
AnimationAction(mixer: AnimationMixer,clip:AnimationClip,localRoot: Object3D)
注意:与直接调用这个构造函数不同,您应该实例化一个带有AnimationMixer.clipAction(clip)的动画操作,因为这个方法提供了缓存,以获得更好的性能
特性
设置为true时,动画会自动的在最后一帧暂停
,只有在最后一帧完成时才有影响,中断时不产生影响。设置为false时,enable属性会自动设置为false在最后一个循环结束的时候表示动画的一组可重用的关键帧跟踪
构造函数
AnimationClip(name,duration,frametracks:Array)
特性
当场景中的多个对象独立动画时,可以为每个对象使用一个动画混合器
构造函数
AnimationMixer(rootObject)
rootObject 要在动画混合器中播放动画的对象
特性
是一个定时的关键帧序列,由时间列表和相关值组成,用于使对象的特定属性具有动画效果
构造函数
KeyframeTrack(name,times: Array,values: Array,interpolation: Constant)
特性
限制
AnimationObjectGroup(obj1,...)
内部使用的辅助动画的一种多功能的物体
方法
场景中引用一个真实的属性,内部使用
允许加权累加的缓冲场景图属性;内部使用
继承自KeyframeTrack
XXXXKeyframeTrack(name,times,values) 在时间上都各个属性的跟踪
name必须和跟踪的属性对应,跟踪位置 就是.position 跟踪四元数就是.quaternion
不然会出现问题
// POSITION
var positionKF = new THREE.VectorKeyframeTrack( '.position', [ 0, 1, 2 ], [ 0, 0, 0, 30, 0, 0, 0, 0, 0 ] );
// SCALE
var scaleKF = new THREE.VectorKeyframeTrack( '.scale', [ 0, 1, 2 ], [ 1, 1, 1, 2, 2, 2, 1, 1, 1 ] );
// ROTATION
// Rotation should be performed using quaternions, using a QuaternionKeyframeTrack
// Interpolating Euler angles (.rotation property) can be problematic and is currently not supported
// set up rotation about x axis
var xAxis = new THREE.Vector3( 1, 0, 0 );
var qInitial = new THREE.Quaternion().setFromAxisAngle( xAxis, 0 );
var qFinal = new THREE.Quaternion().setFromAxisAngle( xAxis, Math.PI );
var quaternionKF = new THREE.QuaternionKeyframeTrack( '.quaternion', [ 0, 1, 2 ], [ qInitial.x, qInitial.y, qInitial.z, qInitial.w, qFinal.x, qFinal.y, qFinal.z, qFinal.w, qInitial.x, qInitial.y, qInitial.z, qInitial.w ] );
// COLOR
var colorKF = new THREE.ColorKeyframeTrack( '.material.color', [ 0, 1, 2 ], [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ], THREE.InterpolateDiscrete );
// OPACITY
var opacityKF = new THREE.NumberKeyframeTrack( '.material.opacity', [ 0, 1, 2 ], [ 1, 0, 1 ] );
// create an animation sequence with the tracks
// If a negative time value is passed, the duration will be calculated from the times of the passed tracks array
var clip = new THREE.AnimationClip( 'Action', 3, [ scaleKF, positionKF, quaternionKF, colorKF, opacityKF ] );
// setup the AnimationMixer
mixer = new THREE.AnimationMixer( mesh );
// create a ClipAction and set it to play
var clipAction = mixer.clipAction( clip );
clipAction.play();
var clock = new THREE.Clock();
var animate = function(){
//controls.update();
var delta = clock.getDelta();
if ( mixer1 ) {
mixer1.update( delta );
}
requestAnimationFrame( animate );
}