Ogre:Animation(Ogre中的動畫)

   在Ogre中Animation是一塊非常重要的部分,但是筆者在學習Ogre的動畫時遺憾的發現關於Ogre中動畫的資料非常的少,Ogre的sample中只有最簡單的導入一個骨骼動畫的例子,在網上也很少有人談及,Ogre Wiki中的教程也是邊邊角角,不知這麼重要的部分爲什麼不做一個全面的tutorial。我從網上的僅有的一些資料和自己的親自試驗總結了一下基本的Ogre動畫的使用,當然Ogre的動畫模塊非常龐大,我總結的只是冰山一角,但是也是最常用的部分。

   Ogre的動畫框架:

繪圖1

這其中最底層的類叫做Keyframe類,它表示某一個可驅動物的(一個結點、一根骨頭、一個頂點。。)的某一個關鍵幀的狀態(位置、縮放、朝向等)和對應的時間點,這樣一個可驅動點可以有多個關鍵幀keyframe。

一個可驅動點的所有keyframe組合成一個track,每個可驅動點都有一個他的track,這就好比某個點在整段動畫中的軌跡,其中keyframe要由track來創建

多個track組合在一起就成爲了一段動畫,用Animation類來表示,這就是一個動畫,例如對於骨骼動畫,他的每一個骨頭都有一個track,那麼所有的骨頭的track的組合在一起也就是整個骨骼動畫了。track由Animation來創建。Animation則可以通過skeleton或者scenenmanager等來創建。

AnimationSate類:通常我們操控一段動畫的播放等都不是直接操縱animation類,而是通過一個類AnimationState,它是animation的一個實例,通過場景管理器創建某個animation的一個animationState,然後就可以利用這個animationstate來播放這個animation了。

動畫種類

Ogre中的動畫主要有skeleton animation、vertex animation、node aniamtion、數值動畫這幾大類

這其中骨骼動畫我們最爲常用,後面將着重分析,頂點動畫大多情況下利用gpu shader來實現以提高效率,所以較少直接使用ogre的動畫機制,這裏就不分析了,下面主要總結一下node animation和骨骼動畫。

但是無論是這裏面的哪一種動畫,實現的機制都是上面的圖繪製的那樣的,只是在不同的動畫裏面使用了圖標類中的不同的派生類,調用了不同的函數。

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);

4、對於每個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的骨骼動畫:

1、還是先導入這個綁定了skeleton的mesh到一個entity上,然後調用SkeletonInstance* ske=entiy->getSkeleton()得到這個骨骼

2、調用skeleton的createAnimation()函數爲這個骨骼添加一個動畫:Animation* anim=ske->createAnimation("My",1);

3、爲這個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好像不推薦這種方式,因爲他們認爲通常人們不需要這麼做,但是某些情況其實還是需要這麼做的,關於在程序中動態創建與綁定骨骼我沒有找到任何資料,自己寫了下程序也是有問題的,希望有這麼做過的高人提供寶貴資料和我交流!


轉載自:http://blog.csdn.net/leonwei/article/details/5819248

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章