您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關GPU Skinning 骨骼動畫原理什么,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
最近在為引擎升級64位的過程中GPU蒙皮也出現了異常,平常骨骼動畫和網格蒙皮用的還是非常多的,但是底層的原理并沒有深究過,想著還是有必要好好整理下這部分內容。
一般我們稱為骨骼動畫(Skeletal Animation),是模型動畫的一種(模型動畫有2種,頂點動畫和骨骼動畫),包含了骨骼(Bone)和蒙皮(Skinned Mesh)兩部分數據。互相連接的骨骼組成骨架結構,通過改變骨骼的朝向和位置來生成動畫。而蒙皮則是這個技術的關鍵點,這里有個誤區,字面意義上新手可能會覺得蒙皮的“皮”指的是貼圖,但實際上這里的皮指的是Mesh本身,蒙皮是指把Mesh的頂點附著(綁定)在骨骼上,并且每個頂點可以被多個骨骼控制,這樣在關節處的頂點由于同時受到父子骨骼的拉扯而改變位置從而消除了縫隙。
頂點的蒙皮信息包含了頂點受哪些骨骼影響以及這些骨骼影響該頂點的權重。有了蒙皮信息,只要我們的骨骼正常運動,蒙皮便會跟著骨骼一起動起來。為了讓骨骼動起來,我們需要動畫數據。在Unity中,我們通過讀取動畫文件中的關鍵幀信息來獲取動畫數據。
這里簡單聊下制作流程,一般模型師制作好模型以后,會交由動畫師來制作模型動畫,常用的工具有3dmax(游戲制作用的比較多)和maya(影視級別)。首先綁定好骨骼,2足類一般使用的比較多的就是T-Pose,并根據設計需要添加一些額外的骨骼(翅膀、飄帶等),根據程序需要添加一些額外的虛擬體掛點(武器、裝備等),這一步通常需要提前規劃好,否則后續需求更改重新綁定骨骼會比較麻煩。一般會選擇盆骨的位置作為根骨骼,但是這種情況下根骨骼與世界原點并不重合,通常會在骨骼空間選擇兩腳之間的中點作為原點(模型空間的原點)構建一根骨骼,讓根骨骼Bip01作為這根骨骼唯一的子骨骼。綁定好骨骼以后,根據設計的動畫方案,調整骨骼位置和朝向并K幀,最終導出動畫文件。
當我們把模型導入Unity,放到世界坐標系中的時候,如果模型帶有骨骼,骨骼會決定模型在世界坐標系中的位置和朝向,因為Mesh的頂點都是依附在骨骼上的。我們調整的是根骨骼的位置和朝向,子骨骼會根據骨骼層次結構中的父子關系計算得出。而對于靜態模型來說,沒有骨骼,所有的頂點都是定義在模型坐標系上的,然后經過模型坐標系到世界坐標系的轉換。
在骨骼的層級結構里面,我們用基于關節為原點的坐標空間來進行描述,所有的子骨骼都是基于關節為原點進行平移、旋轉和縮放的(通常都是旋轉矩陣,骨骼之間通過旋轉變換就可以有復雜的動作組合)。如下圖所示,父骨骼的變換會影響到自身和所有子骨骼。
聊完骨骼動畫原理部分,我們整理下其中的坐標空間變換。模型頂點需要從模型空間變換到所關聯的骨骼自身的骨骼空間(BoneOffsetMatrix),再通過骨骼的世界變換計算出世界坐標(BoneCombinedTransformMatrix)。模型空間即模型師建模時的空間,如上所述,一般是模型兩腳之間的中點,這時模型空間和世界空間是重合的,而根骨骼的Transform也是基于世界空間的。那如果想要得到子骨骼在世界空間的變化矩陣,我們要自下而上地通過一層層的矩陣變化。
有了蒙皮信息,完成了坐標空間的變換,下一個重要的步驟就是頂點混合。混合的意義是消除關節位置的縫隙,讓動畫更加自然。在蒙皮信息中的骨骼權重便是其中的關鍵數據,我們需要遍歷影響該頂點的所有骨骼,計算出頂點的世界坐標,然后用骨骼權重進行加權平均。
Vworld = Vmesh * BoneOffsetMatrix1 * BoneCombindMatrix1 * BoneWeight1 + Vmesh * BoneOffsetMatrix2 * BoneCombindMatrix2 * BoneWeight2 + ... + Vmesh * BoneOffsetMatrixN * BoneCombindMatrixN * BoneWeightN
關于GPU Skinning 骨骼動畫原理什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。