unity游戲之骨骼動畫.doc_第1頁
unity游戲之骨骼動畫.doc_第2頁
unity游戲之骨骼動畫.doc_第3頁
unity游戲之骨骼動畫.doc_第4頁
unity游戲之骨骼動畫.doc_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

最近有人問我怎樣實現(xiàn)骨骼動畫,于是我就想起了我以前寫的這篇文章,貼上來給大家看看。 一、文章編寫目的 寫這篇文章,是給程序員看的。目的在于給程序員介紹骨骼動畫的原理、數(shù)據(jù)結(jié)構(gòu)和程序?qū)崿F(xiàn)的粗略方法。 骨骼動畫的應(yīng)用面很多,主要用在3D角色動畫,不過現(xiàn)在也很多人用于2D動畫。下面的內(nèi)容不會直接的把程序列出,只會闡述原理,關(guān)鍵的步驟是使用矩陣做坐標系變換。原理明白之后,不管2D或者3D應(yīng)該都能自己編寫。 二、什么是骨骼動畫 傳統(tǒng)的動畫,一般是對一個物體對象進行位移、旋轉(zhuǎn)、縮放、變形,然后把關(guān)鍵幀的信息記錄下來,在播放的時候按照關(guān)鍵幀時間對物體對象進行位移、旋轉(zhuǎn)、縮放、變形,并在關(guān)鍵幀與關(guān)鍵幀之間做插值運算。 骨骼動畫的特點是,需要做動畫的物體對象本身不記錄位移、旋轉(zhuǎn)、縮放、變形信息,而是通過了第三方的“骨骼”物體記錄動畫信息,然后物體對象本身只記錄受到骨骼物體影響的權(quán)重。在播放的時候,通過骨骼物體的關(guān)鍵幀和物體對象記錄的權(quán)重,讓動畫重現(xiàn)。 三、骨骼動畫的好處 相對于傳統(tǒng)動畫,骨骼動畫似乎多了2個記錄:骨骼物體和權(quán)重。按道理來說,這種骨骼動畫的資源容量和運行效率應(yīng)該不如傳統(tǒng)的動畫,那為什么還要做骨骼動畫呢? 好處有以下幾點: 1、骨骼動畫是影響到頂點級別的動畫,而且可以多根骨骼根據(jù)權(quán)重影響同一個頂點,不論是2D或者3D使用,都可以讓動畫做得更豐富。 2、做到了對象和動畫分離,我們只需要記錄了物體對于骨骼的蒙皮權(quán)重,就可以單獨的去制作骨骼的動畫,在保證蒙皮信息和骨骼信息一致的情況下,還可以多個物體之間共享動畫。 3、相對于2D的逐幀動畫大大的節(jié)省資源容量。 4、3D角色動畫離不開骨骼動畫。 更多內(nèi)容,請訪問Unity3D技術(shù)社區(qū)【狗刨學(xué)習網(wǎng)】 四、美術(shù)層面理解骨骼動畫 由于骨骼動畫一般是由美術(shù)人員,更準確的是由動畫師來制作的,所以相對于程序員來說,美術(shù)人員接觸的機會比較多。這篇文章是給程序員看的,不過在從數(shù)據(jù)級別操作骨骼動畫之前,最好還是先了解一下美術(shù)層面制作骨骼動畫的方法。至于2D還是3D的情況下做骨骼動畫,其實原理是一樣的,只是2D時少了幾個點,然后一個軸固定值了而已。 這里以3DsMax來舉例子。需要制作一個骨骼動畫,需要這幾樣?xùn)|西: 1、網(wǎng)格物體 2、骨骼物體 3、蒙皮修改器 4、關(guān)鍵幀 網(wǎng)格物體: 需要做動畫的對象物體,如這個例子里面我們需要讓這個長方體翹起來 骨骼物體: 嚴格的骨骼對象物體,3DsMax有2種,一種是Bone,一種是biped。其實所有的物體都可以作為骨骼,包括了多面體網(wǎng)格物體、輔助物體等,都可以作為骨骼使用。不過為了便于一般操作習慣和導(dǎo)出數(shù)據(jù)方便,我們都只用Bone和Biped這兩種。 蒙皮修改器: 3DsMax有2種蒙皮修改器,Skin和Physique。作用都一樣,都是給網(wǎng)格物體的頂點賦予權(quán)重。也沒有誰好誰壞之說,看個人使用習慣。不過由于大部分的模型導(dǎo)出插件都不支持Physique蒙皮修改器,所以一般來說,都是使用Skin。 蒙皮修改器可以使用范圍框、筆刷或者逐個點來調(diào)節(jié)權(quán)重,不過本質(zhì)都是一樣的,最后得到的是幾根骨骼相對于某個頂點的影響權(quán)重。 上圖中的頂點受到骨骼bone01的0.25的影響,受到bone02的0.75的影響。這種情況下,該頂點雖然同時受到2根骨骼的影響,但bone02對它的影響會比較多一點。 正常的情況下,一個頂點受到多根骨骼影響的權(quán)重加起來應(yīng)該等于1。 關(guān)鍵幀: 關(guān)鍵幀信息包括了 l 時間 l 位移旋轉(zhuǎn)縮放的值 l 過渡插值的方式 注意的是,軟件操作上打了關(guān)鍵幀的物體才會動,不打關(guān)鍵幀的物體不會動或者跟隨著父級物體動。所以很多動畫師對一些由于不需要動的物體不打關(guān)鍵幀的。但由于每種動畫導(dǎo)出插件的處理不一樣,有些插件的編寫作者也是忽略了這種情況,而導(dǎo)致了在動畫解析的過程中缺少了部分的數(shù)據(jù),導(dǎo)致動畫播放不正常。 五、程序?qū)用胬斫夤趋绖赢?相對于美術(shù)層面,程序方面需要以下的幾個數(shù)據(jù): 1、頂點索引數(shù)據(jù) 相對于美術(shù)只用關(guān)系網(wǎng)格物體的原始的位移旋轉(zhuǎn)縮放,程序關(guān)心的是網(wǎng)格物體的每一個頂點的位置坐標,還有頂點之間組成網(wǎng)格的索引順序。所謂的原始,指的是物體在沒有進行蒙皮之前的位置。 如果是做2D,那么數(shù)據(jù)就會變成每個面片的四個頂點的坐標,而索引就要自己用算法去生成。當然索引只是在3d渲染時才用到,如果是純2d,你可能只關(guān)心四個頂點的位置,然后繪制出面片。 由于之后一直都需要針對每一個頂點去儲存和提取數(shù)據(jù),所以在一開始的時候,就要把這些頂點的順序固定下來。 2、骨骼物體數(shù)據(jù) 骨骼物體我們不會關(guān)心他是什么類型,體積有多大,或者由多少個頂點組成。我們只關(guān)心它的位移旋轉(zhuǎn)縮放的原始坐標,還有父子鏈接的關(guān)系。這個原始坐標需要和網(wǎng)格物體的原始狀態(tài)保持一致,即沒有蒙皮和做動畫之前,骨骼的位置。由于骨骼通常是很多根的,所以在記錄的開始,也必須先給骨骼都排序。 對于2D來說,骨骼有可能并沒有實質(zhì)性的形象,你可以用一個矩形或者一個線條做代表,最后需要導(dǎo)出的只是該對象的坐標,還有父子鏈接的關(guān)系。 更多內(nèi)容,請訪問Unity3D技術(shù)社區(qū)【狗刨學(xué)習網(wǎng)】 父子鏈接關(guān)系:圖中有2根骨骼。其中父物體發(fā)生位移旋轉(zhuǎn),子物體會跟隨父物體做位移旋轉(zhuǎn)。但子物體做位移旋轉(zhuǎn)的時候,父物體是不會受到影響的。 這里會涉及到2個坐標系的概念,一個是世界坐標,一個是局部坐標。 如果一個物體沒有父物體,也就是說它的父物體就是“世界”,那么它的當前坐標就是世界坐標; 如果一個物體有父物體,那么它除了有世界坐標以外,還有一個相對于父物體的相對坐標。 例如: 父物體的世界坐標是(1,0,0),子物體的世界坐標是(0,1,0),那么子物體相對于父物體的局部坐標就是(-1,1,0) 3、每一個點的蒙皮權(quán)重 之前我們記錄頂點信息和骨骼信息時,都是已經(jīng)排好序的,所以我們在記錄蒙皮權(quán)重的時候,就可以只是記錄各自的序號,還有對應(yīng)的權(quán)重。一個頂點原則上是可以受到無限多根骨骼的影響,不過在實際的應(yīng)用中,為了不讓計算過于復(fù)雜,一般一個頂點最多只會受到4根骨骼的影響。 4、關(guān)鍵幀數(shù)據(jù) 根據(jù)記錄骨骼坐標的坐標系不同,可以選擇記錄每一根骨骼的絕對坐標,也可以記錄有動畫的骨骼的相對坐標。 根據(jù)是否計算插值,可以選擇記錄每一幀的信息,也可以選擇只記錄關(guān)鍵幀的信息,還有關(guān)鍵幀的插值方式。 之前我們介紹了絕對坐標和相對坐標,如果是記錄世界坐標,那是最準確的,但由于每一根骨骼的每一幀都需要去記錄,不管它是否做過動畫,這樣動畫的數(shù)據(jù)量會比較大。如果記錄的是相對坐標,那么如果在子物體沒有做動畫的情況下,它就不需要記錄,而是通過父物體的坐標來計算出子物體的世界坐標。這樣做可以讓導(dǎo)出的數(shù)據(jù)容量很小。不過這會增加解析時候的運算量。使用哪一種方式記錄關(guān)鍵幀,需要根據(jù)自己的項目實際情況來決定。 五、骨骼動畫的計算原理 1、4*4矩陣的概念 對于骨骼關(guān)鍵幀的記錄,我們需要記錄位移(xyz)、旋轉(zhuǎn)(通常用四元數(shù)xyzw)、縮放(xyz)這么多個數(shù)據(jù)。我們計算的時候也可以逐個點去分別計算他們的位移旋轉(zhuǎn)縮放來做動畫。不過骨骼動畫一般會涉及到坐標系的轉(zhuǎn)換,所以我們通常會都用矩陣來做運算。 一般的矩陣運算都是3*3矩陣,但在做3D方面的運算時,通常會把矩陣擴展為4*4矩陣。具體的做法請參考矩陣的基礎(chǔ)知識。大概過程是,先通過旋轉(zhuǎn)和縮放算出3*3矩陣,然后再增多一個維度填上位移坐標。 根據(jù)矩陣左乘和右乘的不同,你的矩陣可能不一樣,下面的公式是以左乘為基礎(chǔ)的。 不同的引擎不同的作者,可能使用不同的矩陣相乘規(guī)則,由于矩陣相乘是不滿足交換律的,也就是AB!=BA,所以一開始必須先搞清楚當前的引擎矩陣究竟是左乘還是右乘的,還有坐標系是用左手坐標系,還是右手坐標系。形式轉(zhuǎn)換經(jīng)常是錯誤的根源。 經(jīng)過位移旋轉(zhuǎn)縮放的計算,或者直接從3D軟件里面就導(dǎo)出矩陣,我們得到的4*4矩陣應(yīng)該是這樣的 左乘: r11 r12 r13 0 r21 r22 r23 0 r31 r32 r33 0 tx ty tz 1 右乘: r11 r21 r31 tx r12 r22 r32 ty r13 r23 r33 tz 0 0 0 1 其中r3*3是旋轉(zhuǎn)縮放計算的矩陣,tx、ty、tz是位移 2、坐標系轉(zhuǎn)換概念 之前說過,骨骼有世界坐標和局部坐標的分部。其實所有東西都有絕對坐標和相對坐標的概念。 拿頂點和骨骼來說,頂點本身有世界坐標,也有相對于骨骼的相對坐標。 關(guān)于絕對坐標系和相對坐標系的轉(zhuǎn)換,請參考3D圖形數(shù)學(xué)里面的坐標系轉(zhuǎn)換。我只說簡單的原理。 假設(shè)有:物體A和物體B,A的世界坐標是Va世界,B的世界坐標是Vb世界 現(xiàn)在我們需要把A的坐標轉(zhuǎn)換成相對于B的相對坐標,記作Vab。 那么我們需要構(gòu)造一個矩陣M世界-b, Vab = Va世界*M世界-b。 其中M世界-b是根據(jù)Vb世界求出來的,一般是Vb世界的逆矩陣。 反過來,如果制定了A在B的相對坐標,也知道了B的實際坐標,我們需要求回A的世界坐標。那么應(yīng)該是 Va世界= Vab*Mb-世界。 其中Mb-世界矩陣就是M世界-b的逆矩陣。乘以逆矩陣的幾何含義,就是把之前做過的變換取消掉。 一定要先把這個矩陣轉(zhuǎn)換坐標系的概念搞清楚,這其實就是整個骨骼動畫的原理關(guān)鍵。其中的A就是物體的頂點,B就是骨骼。 3、骨骼動畫原理 前面廢話了這么多,終于到核心部分了。 我們先從最簡單的情況考慮。 假設(shè)我們的模型只有一個頂點,骨骼也只有一根,這個頂點完全受這根骨骼的影響。 紅色點是頂點,藍色的線是骨骼,這里把骨骼畫成線只是為了便于敘述,其實骨骼是沒有長度概念的。 我們旋轉(zhuǎn)了骨骼,由于頂點完全受骨骼影響,所以頂點的坐標也發(fā)生了變化。 那么我們怎樣求出頂點在動畫之后的坐標呢? 通過觀察,頂點在動畫前和后后,雖然實際坐標發(fā)生了變化,但是相對于骨骼的相對坐標是沒有發(fā)生變化的。只要知道了相對坐標,再通過動畫后骨骼的坐標,就能通過轉(zhuǎn)換坐標系,得到動畫后頂點的世界坐標了。 那么,我們可以這么做: 設(shè): 頂點的動畫前世界坐標為:V世界0 頂點在動畫后世界坐標為:V世界1 骨骼的動畫前世界坐標為:B世界0 骨骼在動畫后世界坐標為:B世界1 然后通過B世界0可以計算出從世界坐標轉(zhuǎn)換到骨骼相對坐標的:M0世界-b 通過B世界1可以計算出從骨骼相對坐標轉(zhuǎn)換到世界坐標的:M1b-世界 然后,我們要求出V世界1 首先求出頂點相對于骨骼的相對坐標Vb: Vb = V世界0*M世界-b 然后當運動之后,我們就可以求得 V世界1=Vb*M1b-世界 那么整個過程就是 V世界1 = V世界0*M世界-b*M1b-世界 看似過程有點復(fù)雜,其實Vb是固定的,我們甚至可以在導(dǎo)出數(shù)據(jù)的時候就先算好了。到了真正需要做動畫的時候,我們只需要再知道一個B世界1,就足夠我們算出當前的頂點應(yīng)該在的位置了。 我們再加大復(fù)雜程度: 假設(shè)頂點還是一個,但骨骼變成了2根,頂點受a骨骼0.75權(quán)重的影響,受b骨骼0.25的影響 我們需要做的和前面一樣,雖然骨骼變成兩根了,但我們可以先忽略了權(quán)重,分別求出V世界1a和V世界1b。 之后的事情就很簡單了: V世界1 = V世界1a*0.75+V世界1b*0.25。 如此類推,把權(quán)重標記成W,就變成了 V世界1 = V世界1a*Wa+V世界1b*Wb+V世界1c*Wc+V世界1c*Wc 4、骨骼動畫的整個工作流程: 1

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論