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