OGRE骨骼動畫與四元數旋轉

一、操縱骨骼點的骨骼動畫

最近在用OGRE庫做三維模型動畫,根據OGRE動畫類型的具體分類,我做的是骨骼動畫,而不是節點動畫、定點動畫等類型。

此外對於骨骼動畫,一般常見的方式是將創作好的動畫幫頂到骨骼節點上,再爲每個骨骼創建關鍵幀,然後刷新顯示。具體的實現代碼,網上有現成的博客裏有,我也學習到很多。但是我其實需要的動畫,只是人爲的在每幀去控制骨骼點進行旋轉、平移等操作,以此實現骨骼動畫,每一幀的骨骼操作動作是通過一定的算法方式,如將一個骨骼節點每秒繞座標軸y旋轉1度,這樣運行起來之後,這個骨骼點就會一直旋轉下去。

具體步驟:

1. 加載mesh文件,一般還需要mesh文件對應的skeleton文件,skeleton跟mesh文件放到一個文件夾下。

2. 創建根節點的子節點,創建mesh的場景並綁定到此節點上,並設定節點的位置與姿態(旋轉角)。

3.利用模型的場景指針中的getSkeleton()方法並賦給SkeletonInstance,如SkeletonInstance * skel= ent->getSkeleton();

4.此時利用骨骼句柄指針,去獲取骨骼中的特點關節點,返回Bone *,代表當前骨骼關節點(此塊骨頭)的指針。如:Bone *manuallyControlledBone = skel->getBone(0);並將此骨骼節點設爲可以手動控制,如:manuallyControlledBone->setManuallyControlled(true);關於獲取每個骨頭,getBone()傳入的爲骨骼節點的編號,一般都爲整數,從0開始,而不是所謂的骨頭的名稱。

5.此時就可控制每一幀時對此骨骼點要進行的操作,如在幀開始的時候,在重寫的frameStarted()函數裏,可以對此骨骼節點進行旋轉,平移等操作。此時顯示起來就是動畫效果。

   如果只是想靜態顯示所操作的變換,那麼在frameStarted()裏對此關節點進行reset(),此時的模型只是靜態的,反應一幀裏所進行的變換操作。

二、關於四元數與旋轉

四元數的具體定義和資料網上很多,大多數都是公式推導,這裏我就不羅列了。在OGRE中,在旋轉一個節點時,除了常見的pitch()、roll()、和yaw()等繞局部座標軸進行旋轉的參數外,還有就是通過四元數的參數。一開始只是知道四元數代表一種旋轉規則,也就是一個線段、向量A繞B(nx,ny,nz)這個向量旋轉a度(弧度制),一般都是逆時針旋轉爲正,從而計算出這個四元數q(w,x,y,z),計算公式爲;

具體見

http://www.ogre3d.org/tikiwiki/Quaternion+and+Rotation+Primer

因此在對某個節點進行旋轉時,可以通過確定旋轉前和旋轉後的一個向量,然後利用getRotationTo獲取這個操作對應的四元數,也可以通過自己要進行旋轉的軸與旋轉角度,構造出四元數,即可進行這個節點的旋轉變換,一般都是局部座標系的變換。

此外對於一個節點(場景節點、骨骼節點等),getOrientation獲取的是四元數,表示此節點對父節點所經過的旋轉操作。而_getDerivedOrientation()才能返回此節點對應世界座標系的旋轉變換,這跟getPosition()與_getDerivedPosition()很相似,一個是獲取此節點在局部座標系下的位置,另一個是獲取其在世界座標系下的位置。這種座標系之間的關係,在未理解之前還是挺複雜的,理解之後就明白多了。




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