由下面幾個文章引發的欲望,讓我自己也試著實現了一個基于2D的骨骼動畫。
一篇講述骨骼動畫數學運算的文章
http://www.cnblogs.com/neoragex2002/archive/2007/09/13/891945.html
兩篇講述骨骼動畫原理和實現的文章 一篇也是用的2D,老外的那篇用的是DX
http://www.shnenglu.com/Leaf/archive/2010/12/31/137818.html
空明流轉用C#寫的一個,當然也可以下載源碼。只是在他的BLOG中,他未解釋任何東西。并且我也未曾下載任何源碼,不知是否源碼中有文檔
http://www.shnenglu.com/lingjingqiu/archive/2008/06/07/52463.aspx
很不爽的是,許多例子或原理講的時候沒有帶旋轉。 其實那才是重頭戲。 空明流轉的貌似有旋轉,可惜C#我也看不懂。還不如自己來一個。
為了迎合廣大人民群眾的取向,先上圖和上碼。
源碼下載地址 (所有源碼和執行程序)
本來按照某種意義上來講,這就算完事兒了。 但還是要簡單介紹一下。
白色方塊:骨骼位置
白色線條:骨骼空間的X軸(注意這是2D,因此只有X和Y軸)
藍色方塊:頂點
(要跟大家說一下對不起,因為我實在是不想仔細地去給一個讓它們看起來會很美的數據。湊合著能表達意思就行)
按鍵:1 2 3 4 5 6 7 8(非小鍵盤)你自己按了就知道。
環境:C++ VS 2005 HGE(僅是用于渲染)。
關于那些代碼
對于骨骼數據的存儲,我并未采用兄弟+孩子節點的表示法。 而是將他們存在了一個數組里。 并標記一個骨骼的父骨骼在數組中的索引。
這樣不管是從數據存儲還是訪問上,都很方便。
另外,骨骼數據并未存放著“它影響了哪些頂點,影響權重”等信息,這些則交由模型持有。 這樣一來,骨骼數據本身就是一堆矩陣的數
據運算,并不涉及其它結構。 放哪都是一樣的。 目前是2D的數據運算。 若有兄弟有蛋疼,將它換成3D數據試試。本想出一個很好的演示
樣例,突然發現數據構建太費勁了,只好省去! 此次也沒有做動畫,而是做了一個手動控制。
關于這次蛋疼的目的
這次蛋疼的目的僅是想充分理解一下骨骼運算。因為公司的骨骼動畫并非由我完成的,所以自己沒有實際操刀做過。由此想自己實現一次,而3D
數據構造又太麻煩。 既然僅是數學運算,何必要找3D呢,2D即可。
關于這次的收獲
這次寫了順便寫了一個2D的向量和一個2D矩陣運算類。矩陣求逆那里很費了一下時間,后來才發現是一個地方寫錯了。 不過糾結總歸有好處,至
少映像更深。 其間參考了許多原碼,由此不得不說明一下我遇到的一些TIP
一、骨骼數據的存放一般是分開存放的。分為“位移,縮放,旋轉”。 在動畫插值時分別插值。 因為矩陣的線性插值形成的旋轉效果是不對的。
(因為SIN COS)并非線性。而位移和縮放通常情況下是固定的常量。不需要進行插值,由此還能省去不少運算。
二、骨骼權重和要為1 (這句有點廢)
三、用SHADER進行骨骼運算時,由于全都是世界矩陣。 由此可省掉一個(0,0,0,1)。 于是,一個骨骼矩陣可以節約一個寄存器。(這
也是老生常淡了)
四、能有耐心地看完DX的例子的人,一定是強人。 因為我一個也沒堅持看完過。
五、多看看DX SDK,即使同一頁,每一次你都會有新收獲。
關于下一次蛋疼計劃
整理一下先前寫的那個3D例子。雖然與VCZH那個比起來很遜,但畢竟是自己生的。
有興趣的朋友就下載來看看吧,一切盡在不言中,我自我感覺那代碼比較好懂。不而要我多解釋。 加上上面好幾篇文章作為“巨人的肩膀”。
謝謝。
GMAIL: BOYUEGAME
時間到,洗洗睡!各位晚安。