参考:http://blog.csdn.net/leonwei/article/details/5819248node
http://blog.csdn.net/debugconsole/article/details/32721901程序员
在Ogre中Animation是一块很是重要的部分,可是笔者在学习Ogre的动画时遗憾的发现关于Ogre中动画的资料很是的少,Ogre的sample中只有最简单的导入一个骨骼动画的例子,在网上也不多有人谈及,Ogre Wiki中的教程也是边边角角,不知这么重要的部分为何不作一个全面的tutorial。我从网上的仅有的一些资料和本身的亲自试验总结了一下基本的Ogre动画的使用,固然Ogre的动画模块很是庞大,我总结的只是冰山一角,可是也是最经常使用的部分。函数
这其中最底层的类叫作Keyframe类,它表示某一个可驱动物的(一个结点、一根骨头、一个顶点。。)的某一个关键帧的状态(位置、缩放、朝向等)和对应的时间点,这样一个可驱动点能够有多个关键帧keyframe。学习
一个可驱动点的全部keyframe组合成一个track,每一个可驱动点都有一个他的track,这就比如某个点在整段动画中的轨迹,其中keyframe要由track来建立动画
多个track组合在一块儿就成为了一段动画,用Animation类来表示,这就是一个动画,例如对于骨骼动画,他的每个骨头都有一个track,那么全部的骨头的track的组合在一块儿也就是整个骨骼动画了。track由Animation来建立。Animation则能够经过skeleton或者scenenmanager等来建立。.net
AnimationSate类:一般咱们操控一段动画的播放等都不是直接操纵animation类,而是经过一个类AnimationState,它是animation的一个实例,经过场景管理器建立某个animation的一个animationState,而后就能够利用这个animationstate来播放这个animation了。插件
动画种类debug
Ogre中的动画主要有skeleton animation、vertex animation、node aniamtion、数值动画这几大类3d
这其中骨骼动画咱们最为经常使用,后面将着重分析,顶点动画大多状况下利用gpu shader来实现以提升效率,因此较少直接使用ogre的动画机制,这里就不分析了,下面主要总结一下node animation和骨骼动画。orm
可是不管是这里面的哪种动画,实现的机制都是上面的图绘制的那样的,只是在不一样的动画里面使用了图标类中的不一样的派生类,调用了不一样的函数。
node Animation
结点动画是指让场景中的某些结点运动,如建立camera的动画等。步骤是这样的:
1首先使用sceneManager来建立一个animation,这里面同时指定动画的名字和长度:
Animation* anim=smgr->createAnimation();
2设置该段动画的关键帧间帧的插值方式,Ogre主要提供两种插值方式:线性的和样条线的,样条线的更加平滑,绘制的是弧线:
anim->setInterpolationMode(Animation::IM_SPLINE);
3.使用animation建立为每一个要驱动的node建立一个track,好比这里咱们只想让一个结点(node,好比它上面挂着摄像机)运动,就只为他建立一个track就好了,第一个参数是这个track的编号
NodeAnimationTrack* t0=anim->createNodeTrack(0,node);
四、对于每一个track建立它的每一个关键帧:
这里好比咱们打算只在首尾设置两个关键帧
TransformKeyFrame* k_t0_0=t0->createNodeKeyFrame(0);//设置该帧的时间点
k_t0_0->setTranslate(Ogre::Vector3(0,0,0));//设置该帧处这个结点的位置和其余几何状态
TransformKeyFrame* k_t0_1=t0->createNodeKeyFrame(1);
k_t0_1->setTranslate(Ogre::Vector3(100,0,0));
5至此这段结点动画就算编完了,下面你须要为他建立一个实例,才能播放,也就是建立一个AnimationState:
AnimationState* as=smgr->createAnimationState(该动画名字);
6最后即是利用这个as来操纵动画了,方面在下面
操纵动画播放
使用AnimationState能够操纵动画,默认状况下一个AnimationState是设置为不能播放状态的,因此要想播放要先调用AnimationState的setEnabled来开启这个动画,这时它默认处于时间轴的开端状态,而后调用它的setTimePosition()函数来转到某一个时间点的状态,这个函数你一般写在帧监听中,逐帧进行增长来播放动画。
骨骼动画
骨骼动画的基础:在ogre中骨骼动画主要涉及两个类,mesh和skeleton,skeleton由许多Bone组成,这些bone之间有层级关系,skeleton就是一个骨架关系,某个mesh能够被绑定在这个skeleton上,绑定的实质就是某个vertex受某些bone的影响,也就是某个bone运动,就会致使和他有关系的那些vertex运动。因此对照本页最上面的图,他最末端控制的店就是skeleton中的每一个bone,一个skeleton中能够蕴含多套animation。
最经常使用的使用骨骼动画的方式是这样的,在ogre中,美工在3d创做软件中创建模型,并绑定骨架,而后建立骨骼动画,最后用ogre的插件导出,导出的文件包括一个mesh文件和一个skeleton文件,可是这个mesh文件中自动的关联了这个skeleton文件。程序员在导入一个mesh到一个entity上时,就等于自动的导入了这个骨骼动画,下面是播放这个动画的方式:
仍是要获得这个AnimationState:AnimationState* as=entity->getAnimationState("动画名字");而后向上面同样操纵这个动画便可。
动态创做骨骼动画
大多数状况下咱们都是向上面那样去建立ogre的骨骼动画,可是在一些状况下,咱们但愿只是在3d制做软件中建立骨骼的绑定关系,然而在程序中动态的编制这个skeleton的骨骼动画:
一、仍是先导入这个绑定了skeleton的mesh到一个entity上,而后调用SkeletonInstance* ske=entiy->getSkeleton()获得这个骨骼
二、调用skeleton的createAnimation()函数为这个骨骼添加一个动画:Animation* anim=ske->createAnimation("My",1);
三、为这个skeleton的每个bone建立track:
Bone* b0=ske->getRootBone();
NodeAnimationTrack* t0=anim->createNodeTrack(0,b0);//例如这是为root bone建立
而后在为每一个bone的track建立关键帧
4最后调用entity->refreshAvailableAnimationState()来更新这个新加入的动画,而后仍然像上面那样获得这个animationstate来操纵动画的播放。
最后,在ogre中其实也彻底能够在程序中动态的建立骨骼,而后绑定mesh,是这一步也不用3D软件制做,可是ogre好像不推荐这种方式,由于他们认为一般人们不须要这么作,可是某些状况其实仍是须要这么作的