骨骼系統

在三維繫統中,骨骼系統是一個重要的部分,是控制人物動作的較佳方法,也是未來人物動作的發展趨勢。當前遊戲的三維人物動作的控制大多采用頂點關鍵幀,但這種方式爲每一幀動畫都要記錄人物的頂點數據,當動作多了的時候,存儲的需求就越來越大,所以這種方式不但限制了人物的多邊形數(頂點數),還限制了動作不能太多。而骨骼動畫不同,每幀只記錄骨骼的轉換,然後通過骨骼與頂點的聯繫把轉換附加到頂點上,生成新的頂點位置,所以骨骼動畫的大小跟人物的複雜程度無關,所以可能一個幾M的頂點關鍵幀動畫用骨骼動畫只需要幾十K,骨骼動畫還有一個最大的優點還是設計的好的化人物之間的動畫可以共享(當然這點不是那麼容易實現的),也就是說只需要一個走動動作文件就可以讓所有的角色在遊戲中走動(是不是無限嚮往了呢)。 不過骨骼動畫比頂點關鍵幀最大的不足就是需要大量的計算,每一個頂點都需要幾個矩陣乘法,所以cpu的能力就限制了人物的頂點的數量(其實是pc的架構導致了從內存輸入數據到cpu是很慢的,而不是cpu慢,現在軟件計算都慢在內存尋址上),不過隨着硬件的不斷改進,這一不足將會成爲歷史。 骨骼系統把角色模型主要有頂點幾何數據,骨骼,頂點與骨骼聯繫,矩陣變化動畫四部分。 首先是頂點幾何數據。這跟原來的模型數據是一致的,就是包含三角形,頂點等渲染所需的數據。 然後是骨骼,這個就是影響該角色模型的關鍵點結構,一般可以在三維軟件如maya,max等導出期間獲得,可以用來判定兩個角色模型是否使用同一個骨骼。 接下來的頂點與骨骼聯繫,就決定一個頂點有多少骨骼影響和其影響權重或者是一個骨骼影響多少頂點及其影響權重,還有。 最後是矩陣變化動畫,這裏面的數據是每跟骨骼的變換矩陣,這個矩陣可以是相對於原點的變換矩陣,也可以是相對於上級骨骼的變換矩陣(這個很複雜,要求骨骼的結構要組織成層次結構,但好像這樣才能實現不同的骨骼之間的統一,但我想還是要爲每一個骨骼加入一個骨骼初始矩陣,這樣的話運算量大大增加,不划算)。 骨骼系統的基本原理就是用骨骼運動的矩陣通過頂點與骨骼聯繫計算出模型頂點的位置。 知道了原理,我們就可以用程序實現了。 首先,是數據結構的設置。爲了發揮骨骼系統的最大優勢,模型要與動畫分離,基於這點,我們就可以定下共兩個結構。接下來就是把上面的四個部分的數據分配到模型和動畫兩個結構中。 模型數據結構應該有關係到幾何的數據:頂點幾何數據、頂點與骨骼聯繫和骨骼。 動畫數據結構應該有關係到矩陣變換的數據:矩陣變化動畫和骨骼。 大家注意到兩個部分都有骨骼,這是因爲兩邊的數據要有一個橋樑來聯繫,否則一個恐龍的模型使用普通人的動畫就會很可笑甚至出錯。 頂點與骨骼的聯繫(蒙皮頂點)這個數據結構可以有兩種方法實現:一種是以骨骼層次爲基礎,把該骨骼影響的所有頂點和影響權重都連接在骨骼上;第二種是以空間位置頂點爲基礎,把影響其運動的骨骼和影響權重連接在頂點上。我選擇了後者。 我的蒙皮頂點結構是這樣的: 蒙皮頂點 { 影響骨骼數量; 影響的權重列表; 影響骨骼的索引列表; 影響骨骼與該頂點的相對位置列表; } 接下來,就是數據來源。最佳的方法當然是從3d專業軟件中導出來,爲了要得到最佳的數據,還是應該自己寫插件。微軟有對應於max和maya的插件,但都是錯誤的,首先沒有進行左右手座標的轉換,紋理座標是錯誤的;沒有進行座標軸交換,如在max裏看起來站着的人到了d3d裏就是躺着的,主要是max裏默認向上的軸是z軸而d3d裏是y軸。當然大家可能還不會寫max和瑪雅的插件,可以看微軟的插件例子,雖然不實用但擁有完整的輸出方法,是個學習的好材料,加上max和maya自帶的sdk,應該會很快寫出自己的插件。過幾天可能會寫一下如何製作max或maya的導出插件,但在這裏就不多說了。 最後是計算和渲染了。這裏的頂點與骨骼聯繫基於空間位置頂點。 第一步,根據當前運動的時間,從動畫數據中把當前骨骼運動的矩陣得到。 比如說,整個動畫有兩秒,共20幀,當前動畫已經到了1.2秒,那就讀出第12幀動畫的各個矩陣。 第二步,遍歷所有骨骼頂點(空間位置頂點),並把各骨骼的影響乘以動畫矩陣。 具體操作應該是這樣的: 對每一個蒙皮頂點,先將頂點位置至零。 for( i = 0; i < 影響骨骼數量; ++i ) {  頂點的位置 += 影響骨骼與該頂點的相對位置列表[i] * 當前骨骼動畫矩陣[影響骨骼的索引列表[i]] * 影響的權重列表[i]; } 第三步,根據剛剛生成的頂點位置計算新的面法線和頂點法線。 當然,若不需要光照處理,這一步可以去掉,甚至前一步也可以用vs來做。事實上在高端的cpu中我這一步甚至比上一步還慢50%。這一步應該先把頂點法線清零,然後遍歷所有面計算出面法線,把面法線分別加到三個頂點上。最後可以選做將頂點法線NORMALIZE,這一步要慎做,因爲可以選擇讓d3d在渲染時再做,在這裏做的話會導致效率更低,所以我選擇讓d3d硬件做。 最後,把計算出來的頂點座標和頂點法線輸入到頂點緩衝,然後渲染出來。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章