骨骼動(dòng)畫(Skeletal Animation)又叫Bone Animation,它與關(guān)鍵幀動(dòng)畫(Key-frame Animation)相比,占用空間小,因?yàn)樗恍枰箨P(guān)鍵幀動(dòng)畫那樣要存儲(chǔ)每一幀的各個(gè)頂點(diǎn)的數(shù)據(jù),而是只需要存儲(chǔ)每一幀的骨骼,骨骼與頂點(diǎn)相比,當(dāng)然要少得多。所以骨骼動(dòng)畫有很多優(yōu)勢,當(dāng)然其技術(shù)難度也很高。我個(gè)人覺得動(dòng)畫在計(jì)算機(jī)圖形學(xué)中是一個(gè)十分重要的內(nèi)容,不管是在游戲、電影動(dòng)畫還是虛擬現(xiàn)實(shí)中,生動(dòng)逼真的動(dòng)畫(人、動(dòng)物等)會(huì)使之增色不少。所以我決定今后的研究方向就是計(jì)算機(jī)動(dòng)畫。目前在研究Skeletal Animation,這是目前動(dòng)畫技術(shù)中的主流。歡迎同好與我交流,共同提高!
骨骼動(dòng)畫的實(shí)現(xiàn)思路是從我們?nèi)说纳眢w的運(yùn)動(dòng)方式而來的(所以VR就是對(duì)現(xiàn)實(shí)世界的虛擬嘛 :-))。動(dòng)畫人物的身體(肉、皮膚)是一個(gè)網(wǎng)格(Mesh)模型,網(wǎng)格的內(nèi)部是一個(gè)骨架結(jié)構(gòu)。當(dāng)人物的骨架運(yùn)動(dòng)時(shí),身體就會(huì)跟著骨架一起運(yùn)動(dòng)。骨架是由一定數(shù)目的骨骼組成的層次結(jié)構(gòu),每一個(gè)骨骼的排列和連接關(guān)系對(duì)整個(gè)骨架的運(yùn)動(dòng)有很重要的影響。每一個(gè)骨骼數(shù)據(jù)都包含其自身的動(dòng)畫數(shù)據(jù)。和每個(gè)骨架相關(guān)聯(lián)的是一個(gè)“蒙皮”(Skin)模型,它提供動(dòng)畫繪制所需要的幾何模型(Vertex,Normal,etc)和紋理材質(zhì)信息。每個(gè)頂點(diǎn)都有相應(yīng)的權(quán)值(Weight),這些權(quán)值定義了骨骼的運(yùn)動(dòng)對(duì)有關(guān)頂點(diǎn)的影響因子。當(dāng)把動(dòng)畫人物的姿勢和全局運(yùn)動(dòng)信息作用到骨架上時(shí),這個(gè)“蒙皮”模型就會(huì)跟隨骨架一起運(yùn)動(dòng)。
所以關(guān)鍵是對(duì)骨架進(jìn)行動(dòng)畫生成,生成的方法也是用關(guān)鍵幀。關(guān)鍵幀動(dòng)畫是對(duì)人物的網(wǎng)格(Mesh)模型采用關(guān)鍵幀生成動(dòng)畫;而骨骼動(dòng)畫則是對(duì)人物的骨架采用關(guān)鍵幀生成動(dòng)畫,然后再讓網(wǎng)格(Mesh)模型跟隨骨架運(yùn)動(dòng)。關(guān)鍵幀動(dòng)畫實(shí)現(xiàn)的2個(gè)關(guān)鍵點(diǎn)是:關(guān)鍵幀的選取和中間幀的插補(bǔ)。
關(guān)鍵幀的指定有2種基本的方法:前向動(dòng)力學(xué)(FK)和逆向動(dòng)力學(xué)(IK)。前向動(dòng)力學(xué)用一組節(jié)點(diǎn)的角度來找到末端受動(dòng)器的位置;而逆向動(dòng)力學(xué)則是找到將末端受動(dòng)器置于所要位置所需的一組節(jié)點(diǎn)角度。前向動(dòng)力學(xué)的優(yōu)點(diǎn)是:計(jì)算簡單,運(yùn)算速度快,缺點(diǎn)是:需指定每個(gè)關(guān)節(jié)的角度和位置,而由于骨架的各個(gè)節(jié)點(diǎn)之間有內(nèi)在的關(guān)聯(lián)性,直接指定各關(guān)節(jié)的值很容易產(chǎn)生不自然協(xié)調(diào)的動(dòng)作;逆向動(dòng)力學(xué)的優(yōu)點(diǎn)是:只需指定主要關(guān)節(jié)點(diǎn)的位置,負(fù)擔(dān)輕,缺點(diǎn)是:計(jì)算模型比較復(fù)雜,開發(fā)者需要機(jī)械運(yùn)動(dòng)和動(dòng)力學(xué)、幾何學(xué)以及向量數(shù)學(xué)等方面的相關(guān)知識(shí)。
中間幀的插值分2步:(1) 根據(jù)當(dāng)前時(shí)間,通過插值計(jì)算出每個(gè)骨骼的旋轉(zhuǎn)、平移等值,形成中間幀的骨架。插值算法一般采用四元數(shù)(Quternion)的球面線性插值(Spherical linear interpolation)SLERP,SLERP特別適合在兩個(gè)方位之間進(jìn)行插值,不會(huì)出現(xiàn)像對(duì)歐拉角插值那樣出現(xiàn)萬象鎖的現(xiàn)象,而且這種插值能產(chǎn)生更平滑和連續(xù)的旋轉(zhuǎn),表達(dá)方式也很簡潔;(2) 根據(jù)骨架的變化情況,插值計(jì)算出骨架的“蒙皮”模型的各個(gè)頂點(diǎn)的位置變化。對(duì)于某個(gè)特定骨骼,“蒙皮”模型的頂點(diǎn)變換矩陣=初始姿勢的變換矩陣的逆×姿勢變換后的矩陣。另外還要考慮頂點(diǎn)可能受多個(gè)骨骼運(yùn)動(dòng)的影響。