一、基本原理
骨骼動畫的基本原理就是首先控制各個骨骼和關節,再使附在上面的蒙皮(mesh)與其相匹配。
乙個角色由作為**的單一網格模型和按照一定層次組織起來的骨骼組成。
骨骼層次描述了角色的結構:相鄰的骨骼通過關節連線,並且可以做出相對的運動。這裡要注意的是,骨骼間是具有「父子」關係的,比如,右前臂是右上臂的子節點,同時又是右手的父節點。通過改變相鄰骨骼間的位移、夾角,就可以做出不同的動作,實現不同的動畫效果。
**作為乙個網格蒙在骨骼之上,規定角色的外觀。這裡的**不死固定不變的剛性mesh,而是可以在骨骼影響下變化的乙個可變性mesh。組成**的每乙個頂點都會受到乙個或多個骨骼的影響(就人體來說,乙個網格頂點最多受到4塊骨骼的影響),不同的骨骼按照與頂點的幾何、物理關係確定對該頂點的影響權重,通過計算影響該頂點的不同骨骼加權值之和就可以得到該頂點在世界座標系中的正確位置。
動畫檔案中的關鍵幀一般儲存著骨骼的位置、朝向等資訊。通過在動畫序列中相鄰的兩個關鍵幀之間插值可以確定某一時刻各個骨骼的新位置和新朝向(或者不插值,直接從乙個關鍵幀變到另乙個關鍵幀,作為簡單版本實現,本例中就沒有插值),這樣就可以計算出乙個骨骼變換矩陣。然後**網格的每個頂點根據影響它的骨骼及相應的權重計算它們的加權和,就可以計算出這個頂點在世界座標系(強調)中的新位置。如此,便實現了在骨骼驅動下的單一**網格變形動畫(這就是簡單版本的骨骼蒙皮動畫)。
二、實現
下面主要討論技術細節。
在乙個典型的骨骼蒙皮動畫模型中,會儲存如下資訊:網格資訊、骨骼資訊和動畫資訊。
網格資訊是角色的多邊形模型。該多邊形模型一般由三角形麵片組成,每個三角形麵片有三個指向模型的頂點表的索引(通過該索引,可以確定這個三角形的三個定點的座標)。頂點表中的每一頂點除了帶有位置、法向量、材質、紋理等基本資訊外,還會指出有哪些骨骼影響了該頂點,影響權重又是多少。
骨骼資訊包括全部去骨骼的數量和每個骨骼的具體資訊。每一根骨骼包括該骨骼在父骨骼座標系中的變換矩陣(可能為了方便會計算2個變換矩陣:絕對變換矩陣和相對變換矩陣),通過該變換矩陣可以在確定父骨骼位置的前提下,確定子骨骼的位置。另外,為了方便,常常計算出每根骨骼相對於世界座標系的「顯示變換矩陣」(它其實就是通過父骨骼的顯示矩陣乘以子骨骼相對于父骨骼的平移+旋轉變換矩陣得到的)總之,每乙個關鍵幀指出了每乙個骨骼在該時刻相對于父骨骼的變換矩陣或者說該骨骼相對于父骨骼的位移、旋轉等操作。
關鍵的計算公式:
1. 子骨骼的位置=父骨骼的位置*子骨骼相對于父骨骼的平移矩陣*子骨骼相對于父骨骼的旋轉矩陣
2. mesh頂點的位置=最初狀態頂點的位置*初始狀態骨骼逆變換*骨骼本地座標系下的新變換
(有必要解釋一下,「初始狀態骨骼你變換」其實就是「世界座標系到骨骼本地座標系」的變換矩陣,之所以叫「逆矩陣」,是因為預設情況下,我們認為「骨骼本地座標到世界座標系」的變換為「正」--最常用的意思,更多解釋見
本例中的3個矩陣含義:
「顯示變換矩陣」可以直接從世界座標系變換到特定骨骼的本地座標系(世界座標系的標準矩陣乘以顯示矩陣);「絕對變換矩陣」是相對於世界座標系的原點而言的,不包含子骨骼相對于父骨骼的平移;「相對變換矩陣」是子骨骼相對于父骨骼的本地座標系而言的,同樣不包含平移,只含旋轉操作。定義他們是有目的的:「絕對變換矩陣」是mesh頂點需要的,「相對變換矩陣」則是「絕對變換矩陣」需要的。
三、設計
乙個模型類(bonemodel)包含乙個骨骼類(bone)和乙個網格定點類(meshvertex)。
骨骼類的屬性:
/*骨骼類*/
class bone
;
網格頂點類的屬性:
/*蒙皮頂點類*/
class meshvertex
;
骨骼模型類的屬性:
/*定義一些巨集*/
#define max_bones 2
#define max_meshes 3
#define max_vertices_per_mesh 4
class bonemodel
;
更新骨骼位置的函式:
/*更新所有的骨骼變換矩陣*/
void updatebones()
else
}}
繪製網格頂點的函式(注意乘的是abso函式):
void drawmesh()
/*渲染網格頂點*/
glcolor4f(pobjmodel->m_modelpoints[nidx].m_red,pobjmodel->m_modelpoints[nidx].m_green,
pobjmodel->m_modelpoints[nidx].m_blue,pobjmodel->m_modelpoints[nidx].m_alpha);
glnormal3f(vnx,vny,vnz);
glvertex3f(vx,vy,vz);
}glend();
}}
繪製整個模型的函式:
/*根據骨骼的位置變化,繪製骨骼和蒙皮*/
void drawmodel()
}
關於 骨骼動畫之理解蒙皮演算法
把三維骨骼頂點聯絡至骨骼的位置的過程,稱為蒙皮。蒙皮用的網格是通過頂點聯絡上骨骼,每個頂點可以繫結乙個或者多個骨骼 一般最多允許4根骨骼 若某頂點只繫結至一根骨骼,它就會完全跟隨該骨骼移動。若繫結至多個骨骼,該頂點的位置就等於把它逐一繫結繫結個別骨骼,在通過權重加權平均。能把網格頂點從原來位置 繫結...
巧用帶有骨骼動畫的四種蒙皮技術
深入研究d3dx 14 帶有骨骼動畫的四種蒙皮技術 darren 基於shader的蒙皮和基於軟體的蒙皮技術 預備知識 1 模型的骨骼 骨骼動畫中的就是一些矩陣資料,這些矩陣儲存的是各個相關頂點的資訊,不同的頂點對應不同的矩陣就得到了骨骼,比如乙個立方體的頂部4個頂點的變化我們將其繫結骨骼是一組矩陣...
骨骼動畫公式
本節你將回顧一些骨骼動畫用到的概念和數學公式。乙個骨骼動畫是由許多關鍵幀組成的,每個關鍵幀儲存了乙個bone的配置 朝向和位置 和bone對應的時間。在每個時間間隔,你使用乙個或多個關鍵幀改變bone的配置。圖11 7展示了一張如圖11 3中的骨骼的動畫,當left shoulder bone的朝向...