參考: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好像不推薦這種方式,由於他們認爲一般人們不須要這麼作,可是某些狀況其實仍是須要這麼作的