資源描述:
《骨骼動(dòng)畫的原理與實(shí)現(xiàn)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、骨骼動(dòng)畫的原理與實(shí)現(xiàn)3D2008-05-2814:04:10閱讀176評(píng)論0??字號(hào):大中小?訂閱????這里的骨骼蒙皮動(dòng)畫特指skinndmesh,也叫骨骼動(dòng)畫。無(wú)論是合金裝備,波斯王子,還是魔獸世界,到處都是骨骼動(dòng)畫技術(shù)的運(yùn)用。用它塑造了各種各樣,栩栩如生的生物。其中,人類體格的骨骼動(dòng)畫運(yùn)用最為廣泛。現(xiàn)在讓我們一步一步揭開(kāi)它神秘的面紗。?從本質(zhì)上來(lái)講,所有的3D角色動(dòng)畫系統(tǒng)都是基于一種邏輯,就是用一定的方法去改變Mesh頂點(diǎn)的位置,只是具體改變的方法不同而已。骨骼動(dòng)畫也是一樣的。?骨骼動(dòng)畫的基本原理就是首先控制各個(gè)骨骼和關(guān)節(jié),再使符在上面的skinnedmesh與其匹配。在骨骼蒙皮
2、動(dòng)畫中,一個(gè)角色由作為皮膚的單一網(wǎng)格模型和按照一定層次組織起來(lái)的骨骼組成。骨骼層次描述了角色的結(jié)構(gòu),就像關(guān)節(jié)動(dòng)畫中的不同部分一樣,骨骼蒙皮動(dòng)畫中的骨骼按照角色的特點(diǎn)組成一個(gè)層次結(jié)構(gòu)。相鄰的骨骼通過(guò)關(guān)節(jié)相連,并且可以作相對(duì)的運(yùn)動(dòng)。通過(guò)改變相鄰骨骼間的夾角,位移,組成角色的骨骼就可以做出不同的動(dòng)作,實(shí)現(xiàn)不同的動(dòng)畫效果。皮膚則作為一個(gè)網(wǎng)格蒙在骨骼之上,規(guī)定角色的外觀。這里的皮膚不是固定不變的剛性網(wǎng)格,而是可以在骨骼影響下變化的一個(gè)可變形網(wǎng)格。組成皮膚的每一個(gè)頂點(diǎn)都會(huì)受到一個(gè)或者多個(gè)骨骼的影響。在頂點(diǎn)受到多個(gè)骨骼影響的情況下,不同的骨骼按照與頂點(diǎn)的幾何,物理關(guān)系確定對(duì)該頂點(diǎn)的影響權(quán)重,這一權(quán)重
3、可以通過(guò)建模軟件計(jì)算,也可以手工設(shè)置。通過(guò)計(jì)算影響該頂點(diǎn)的不同骨骼對(duì)它影響的加權(quán)和就可以得到該頂點(diǎn)在世界坐標(biāo)系中的正確位置。動(dòng)畫文件中的關(guān)鍵幀一般保存著骨骼的位置,朝向等信息。通過(guò)在動(dòng)畫序列中相鄰的兩個(gè)關(guān)鍵幀間插值可以確定某一時(shí)刻各個(gè)骨骼的新位置和新朝向。然后按照皮膚網(wǎng)格各個(gè)頂點(diǎn)中保存的影響它的骨骼索引和相應(yīng)的權(quán)重信息可以計(jì)算出該頂點(diǎn)的新位置。這樣就實(shí)現(xiàn)了在骨骼驅(qū)動(dòng)下的單一皮膚網(wǎng)格變形動(dòng)畫?;蛘吆?jiǎn)單地說(shuō)骨骼蒙皮動(dòng)畫。骨骼蒙皮動(dòng)畫的效果比關(guān)節(jié)動(dòng)畫和單一網(wǎng)格動(dòng)畫更逼真,更生動(dòng)。而且,隨著3D硬件性能的提高,越來(lái)越多的相關(guān)計(jì)算可以通過(guò)硬件來(lái)完成,骨骼蒙皮動(dòng)畫已經(jīng)成為各類實(shí)時(shí)動(dòng)畫應(yīng)用中使用最廣
4、泛的動(dòng)畫技術(shù)。?下面討論骨骼蒙皮動(dòng)畫實(shí)現(xiàn)的技術(shù)細(xì)節(jié)。在一個(gè)典型的骨骼蒙皮動(dòng)畫模型文件中,會(huì)保存如下信息:網(wǎng)格信息,骨骼信息和動(dòng)畫信息。網(wǎng)格信息是角色的多邊形模型。該多邊形模型一般由三角形面片組成,每一三角形面片有三個(gè)指向模型的頂點(diǎn)表的索引。通過(guò)該索引,可以確定該三角形的三個(gè)頂點(diǎn)。頂點(diǎn)表中的每一頂點(diǎn)除了帶有位置,法向量,材質(zhì),紋理等基本信息外,還會(huì)指出有哪些骨骼影響了該頂點(diǎn),影響權(quán)重又是多少。影響一個(gè)頂點(diǎn)的最大骨骼數(shù)一般取決于模型的設(shè)計(jì)和目標(biāo)硬件平臺(tái)的限制。比如,對(duì)于一個(gè)典型的人體骨架,一般只有在關(guān)節(jié)附近的頂點(diǎn)才會(huì)受到相鄰幾塊骨骼的影響,而同時(shí)影響某一頂點(diǎn)的骨骼數(shù),也不會(huì)超過(guò)四塊。骨骼信
5、息包括全部骨骼的數(shù)量和每一骨骼的具體信息。所有的骨骼按照父子關(guān)系組織成一棵樹(shù)。樹(shù)根代表整個(gè)骨架,其余每一節(jié)點(diǎn)包括葉子節(jié)點(diǎn)代表一根骨骼。每一根骨骼包括該骨骼在父骨骼坐標(biāo)系中的變換矩陣,通過(guò)該變化矩陣確定了該骨骼在父骨骼坐標(biāo)系中的位置。在動(dòng)畫信息中則保存了若干關(guān)鍵幀。每一關(guān)鍵幀指出了每一骨骼在該時(shí)刻相對(duì)于父骨骼坐標(biāo)系的變換矩陣,當(dāng)然也可以是該骨骼相對(duì)于父骨骼的位置,朝向等變動(dòng)。在播放動(dòng)畫序列中的任一時(shí)刻:?1)首先確定該時(shí)刻之前和之后的兩個(gè)關(guān)鍵幀,然后按照該時(shí)刻與前后兩個(gè)關(guān)鍵幀時(shí)刻的時(shí)間值插值計(jì)算出該時(shí)刻該骨骼相對(duì)于父骨骼的新變換矩陣,這個(gè)變換矩陣往往代表旋轉(zhuǎn)變換,放縮變換也能接受,如果是
6、平移變換矩陣,很容易將Mesh四分五裂。?2)對(duì)于皮膚網(wǎng)格中的每一個(gè)頂點(diǎn),計(jì)算它在世界坐標(biāo)中新的位置和朝向。首先找到影響該頂點(diǎn)的所有骨骼。然后計(jì)算每一骨骼對(duì)該頂點(diǎn)的影響。也就時(shí)說(shuō),計(jì)算在該骨骼獨(dú)立作用下頂點(diǎn)的新位置。計(jì)算按照如下公式:?????????????頂點(diǎn)的新位置=最初狀態(tài)頂點(diǎn)的位置*最初狀態(tài)骨骼世界變換矩陣的逆矩陣*骨骼的新變換矩陣(I)?然后將所有這些新位置按照每一骨骼的影響權(quán)重加權(quán)求和。注意所有權(quán)重的和應(yīng)該恰好為1。在公式(I)中,最初狀態(tài)頂點(diǎn)的位置為什么首先要與最初狀態(tài)骨骼世界變矩陣的逆矩陣相乘呢?前面說(shuō)過(guò),骨骼的新變換矩陣是相對(duì)于父骨骼變換的,另一方面這個(gè)新變換矩陣是
7、世界變換矩陣,它的任何變換是相對(duì)于世界坐標(biāo)系原點(diǎn)的。因此需要把最初狀態(tài)頂點(diǎn)移動(dòng)到相當(dāng)于父骨骼節(jié)點(diǎn)是原點(diǎn)的位置上,再進(jìn)行矩陣變換。?3)根據(jù)網(wǎng)格模型頂點(diǎn)的新位置和朝向繪制角色網(wǎng)格。?下面我們結(jié)合具體的圖形API環(huán)境(Direct3D)來(lái)進(jìn)一步介紹骨骼動(dòng)畫。?第一,了解骨骼結(jié)構(gòu)(SkeletalStructures)和骨層級(jí)(BoneHierarchies):?骨骼結(jié)構(gòu)就是連續(xù)很多的骨頭(Bone)相結(jié)合,形成的骨層級(jí)。第一個(gè)骨頭叫做根骨(root