Ogre Animation(Ogre中的動畫)

2021-05-27 14:10:32 字數 2727 閱讀 7863

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

ogre的動畫框架:

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

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

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

動畫種類

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

6最後便是利用這個as來操縱動畫了,方面在下面

骨骼動畫

骨骼動畫的基礎:在ogre中骨骼動畫主要涉及兩個類,mesh和skeleton,skeleton由許多bone組成,這些bone之間有層級關係,skeleton就是乙個骨架關係,某個mesh可以被繫結在這個skeleton上,繫結的實質就是某個vertex受某些bone的影響,也就是某個bone運動,就會導致和他有關係的那些vertex運動。所以對照本頁最上面的圖,他最末端控制的店就是skeleton中的每個bone,乙個skeleton中可以蘊含多套animation。

還是要得到這個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建立關鍵幀

最後,在ogre中其實也完全可以在程式中動態的建立骨骼,然後繫結mesh,是這一步也不用3d軟體製作,但是ogre好像不推薦這種方式,因為他們認為通常人們不需要這麼做,但是某些情況其實還是需要這麼做的,關於在程式中動態建立與繫結骨骼我沒有找到任何資料,自己寫了下程式也是有問題的,希望有這麼做過的高人提供寶貴資料和我交流!

Ogre Animation(Ogre中的動畫)

ogre的動畫框架 這其中最底層的類叫做keyframe類,它表示某乙個可驅動物的 乙個結點 一根骨頭 乙個頂點。的某乙個關鍵幀的狀態 位置 縮放 朝向等 和對應的時間點,這樣乙個可驅動點可以有多個關鍵幀keyframe。乙個可驅動點的所有keyframe組合成乙個track,每個可驅動點都有乙個他...

element ui中Checkbox的動態渲染

今天做乙個vue的多項選擇效果,引入了element ui中的checkbox外掛程式,使用的是它的多選框組的ui外掛程式,其中這些checkbox是通過後台返回資料動態進行渲染,在渲染的過程中遇見了一些很不正常的互動效果,要麼是所有的checkbox都選中了,取消乙個checkbox選中狀態就少乙...

SpringBoot中Example的動態條件查詢

一 無匹配器的情況 person person new person person.setname test role role new role role.setname 經理 person.setrole role example ex example.of person 動態查詢 person...