![unity游戲之骨骼動(dòng)畫.doc_第1頁](http://file.renrendoc.com/FileRoot1/2020-1/16/72da9620-2cc0-48a0-a207-62b6e2d59029/72da9620-2cc0-48a0-a207-62b6e2d590291.gif)
![unity游戲之骨骼動(dòng)畫.doc_第2頁](http://file.renrendoc.com/FileRoot1/2020-1/16/72da9620-2cc0-48a0-a207-62b6e2d59029/72da9620-2cc0-48a0-a207-62b6e2d590292.gif)
![unity游戲之骨骼動(dòng)畫.doc_第3頁](http://file.renrendoc.com/FileRoot1/2020-1/16/72da9620-2cc0-48a0-a207-62b6e2d59029/72da9620-2cc0-48a0-a207-62b6e2d590293.gif)
![unity游戲之骨骼動(dòng)畫.doc_第4頁](http://file.renrendoc.com/FileRoot1/2020-1/16/72da9620-2cc0-48a0-a207-62b6e2d59029/72da9620-2cc0-48a0-a207-62b6e2d590294.gif)
![unity游戲之骨骼動(dòng)畫.doc_第5頁](http://file.renrendoc.com/FileRoot1/2020-1/16/72da9620-2cc0-48a0-a207-62b6e2d59029/72da9620-2cc0-48a0-a207-62b6e2d590295.gif)
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
最近有人問我怎樣實(shí)現(xiàn)骨骼動(dòng)畫,于是我就想起了我以前寫的這篇文章,貼上來給大家看看。 一、文章編寫目的 寫這篇文章,是給程序員看的。目的在于給程序員介紹骨骼動(dòng)畫的原理、數(shù)據(jù)結(jié)構(gòu)和程序?qū)崿F(xiàn)的粗略方法。 骨骼動(dòng)畫的應(yīng)用面很多,主要用在3D角色動(dòng)畫,不過現(xiàn)在也很多人用于2D動(dòng)畫。下面的內(nèi)容不會(huì)直接的把程序列出,只會(huì)闡述原理,關(guān)鍵的步驟是使用矩陣做坐標(biāo)系變換。原理明白之后,不管2D或者3D應(yīng)該都能自己編寫。 二、什么是骨骼動(dòng)畫 傳統(tǒng)的動(dòng)畫,一般是對(duì)一個(gè)物體對(duì)象進(jìn)行位移、旋轉(zhuǎn)、縮放、變形,然后把關(guān)鍵幀的信息記錄下來,在播放的時(shí)候按照關(guān)鍵幀時(shí)間對(duì)物體對(duì)象進(jìn)行位移、旋轉(zhuǎn)、縮放、變形,并在關(guān)鍵幀與關(guān)鍵幀之間做插值運(yùn)算。 骨骼動(dòng)畫的特點(diǎn)是,需要做動(dòng)畫的物體對(duì)象本身不記錄位移、旋轉(zhuǎn)、縮放、變形信息,而是通過了第三方的“骨骼”物體記錄動(dòng)畫信息,然后物體對(duì)象本身只記錄受到骨骼物體影響的權(quán)重。在播放的時(shí)候,通過骨骼物體的關(guān)鍵幀和物體對(duì)象記錄的權(quán)重,讓動(dòng)畫重現(xiàn)。 三、骨骼動(dòng)畫的好處 相對(duì)于傳統(tǒng)動(dòng)畫,骨骼動(dòng)畫似乎多了2個(gè)記錄:骨骼物體和權(quán)重。按道理來說,這種骨骼動(dòng)畫的資源容量和運(yùn)行效率應(yīng)該不如傳統(tǒng)的動(dòng)畫,那為什么還要做骨骼動(dòng)畫呢? 好處有以下幾點(diǎn): 1、骨骼動(dòng)畫是影響到頂點(diǎn)級(jí)別的動(dòng)畫,而且可以多根骨骼根據(jù)權(quán)重影響同一個(gè)頂點(diǎn),不論是2D或者3D使用,都可以讓動(dòng)畫做得更豐富。 2、做到了對(duì)象和動(dòng)畫分離,我們只需要記錄了物體對(duì)于骨骼的蒙皮權(quán)重,就可以單獨(dú)的去制作骨骼的動(dòng)畫,在保證蒙皮信息和骨骼信息一致的情況下,還可以多個(gè)物體之間共享動(dòng)畫。 3、相對(duì)于2D的逐幀動(dòng)畫大大的節(jié)省資源容量。 4、3D角色動(dòng)畫離不開骨骼動(dòng)畫。 更多內(nèi)容,請(qǐng)?jiān)L問Unity3D技術(shù)社區(qū)【狗刨學(xué)習(xí)網(wǎng)】 四、美術(shù)層面理解骨骼動(dòng)畫 由于骨骼動(dòng)畫一般是由美術(shù)人員,更準(zhǔn)確的是由動(dòng)畫師來制作的,所以相對(duì)于程序員來說,美術(shù)人員接觸的機(jī)會(huì)比較多。這篇文章是給程序員看的,不過在從數(shù)據(jù)級(jí)別操作骨骼動(dòng)畫之前,最好還是先了解一下美術(shù)層面制作骨骼動(dòng)畫的方法。至于2D還是3D的情況下做骨骼動(dòng)畫,其實(shí)原理是一樣的,只是2D時(shí)少了幾個(gè)點(diǎn),然后一個(gè)軸固定值了而已。 這里以3DsMax來舉例子。需要制作一個(gè)骨骼動(dòng)畫,需要這幾樣?xùn)|西: 1、網(wǎng)格物體 2、骨骼物體 3、蒙皮修改器 4、關(guān)鍵幀 網(wǎng)格物體: 需要做動(dòng)畫的對(duì)象物體,如這個(gè)例子里面我們需要讓這個(gè)長(zhǎng)方體翹起來 骨骼物體: 嚴(yán)格的骨骼對(duì)象物體,3DsMax有2種,一種是Bone,一種是biped。其實(shí)所有的物體都可以作為骨骼,包括了多面體網(wǎng)格物體、輔助物體等,都可以作為骨骼使用。不過為了便于一般操作習(xí)慣和導(dǎo)出數(shù)據(jù)方便,我們都只用Bone和Biped這兩種。 蒙皮修改器: 3DsMax有2種蒙皮修改器,Skin和Physique。作用都一樣,都是給網(wǎng)格物體的頂點(diǎn)賦予權(quán)重。也沒有誰好誰壞之說,看個(gè)人使用習(xí)慣。不過由于大部分的模型導(dǎo)出插件都不支持Physique蒙皮修改器,所以一般來說,都是使用Skin。 蒙皮修改器可以使用范圍框、筆刷或者逐個(gè)點(diǎn)來調(diào)節(jié)權(quán)重,不過本質(zhì)都是一樣的,最后得到的是幾根骨骼相對(duì)于某個(gè)頂點(diǎn)的影響權(quán)重。 上圖中的頂點(diǎn)受到骨骼bone01的0.25的影響,受到bone02的0.75的影響。這種情況下,該頂點(diǎn)雖然同時(shí)受到2根骨骼的影響,但bone02對(duì)它的影響會(huì)比較多一點(diǎn)。 正常的情況下,一個(gè)頂點(diǎn)受到多根骨骼影響的權(quán)重加起來應(yīng)該等于1。 關(guān)鍵幀: 關(guān)鍵幀信息包括了 l 時(shí)間 l 位移旋轉(zhuǎn)縮放的值 l 過渡插值的方式 注意的是,軟件操作上打了關(guān)鍵幀的物體才會(huì)動(dòng),不打關(guān)鍵幀的物體不會(huì)動(dòng)或者跟隨著父級(jí)物體動(dòng)。所以很多動(dòng)畫師對(duì)一些由于不需要?jiǎng)拥奈矬w不打關(guān)鍵幀的。但由于每種動(dòng)畫導(dǎo)出插件的處理不一樣,有些插件的編寫作者也是忽略了這種情況,而導(dǎo)致了在動(dòng)畫解析的過程中缺少了部分的數(shù)據(jù),導(dǎo)致動(dòng)畫播放不正常。 五、程序?qū)用胬斫夤趋绖?dòng)畫 相對(duì)于美術(shù)層面,程序方面需要以下的幾個(gè)數(shù)據(jù): 1、頂點(diǎn)索引數(shù)據(jù) 相對(duì)于美術(shù)只用關(guān)系網(wǎng)格物體的原始的位移旋轉(zhuǎn)縮放,程序關(guān)心的是網(wǎng)格物體的每一個(gè)頂點(diǎn)的位置坐標(biāo),還有頂點(diǎn)之間組成網(wǎng)格的索引順序。所謂的原始,指的是物體在沒有進(jìn)行蒙皮之前的位置。 如果是做2D,那么數(shù)據(jù)就會(huì)變成每個(gè)面片的四個(gè)頂點(diǎn)的坐標(biāo),而索引就要自己用算法去生成。當(dāng)然索引只是在3d渲染時(shí)才用到,如果是純2d,你可能只關(guān)心四個(gè)頂點(diǎn)的位置,然后繪制出面片。 由于之后一直都需要針對(duì)每一個(gè)頂點(diǎn)去儲(chǔ)存和提取數(shù)據(jù),所以在一開始的時(shí)候,就要把這些頂點(diǎn)的順序固定下來。 2、骨骼物體數(shù)據(jù) 骨骼物體我們不會(huì)關(guān)心他是什么類型,體積有多大,或者由多少個(gè)頂點(diǎn)組成。我們只關(guān)心它的位移旋轉(zhuǎn)縮放的原始坐標(biāo),還有父子鏈接的關(guān)系。這個(gè)原始坐標(biāo)需要和網(wǎng)格物體的原始狀態(tài)保持一致,即沒有蒙皮和做動(dòng)畫之前,骨骼的位置。由于骨骼通常是很多根的,所以在記錄的開始,也必須先給骨骼都排序。 對(duì)于2D來說,骨骼有可能并沒有實(shí)質(zhì)性的形象,你可以用一個(gè)矩形或者一個(gè)線條做代表,最后需要導(dǎo)出的只是該對(duì)象的坐標(biāo),還有父子鏈接的關(guān)系。 更多內(nèi)容,請(qǐng)?jiān)L問Unity3D技術(shù)社區(qū)【狗刨學(xué)習(xí)網(wǎng)】 父子鏈接關(guān)系:圖中有2根骨骼。其中父物體發(fā)生位移旋轉(zhuǎn),子物體會(huì)跟隨父物體做位移旋轉(zhuǎn)。但子物體做位移旋轉(zhuǎn)的時(shí)候,父物體是不會(huì)受到影響的。 這里會(huì)涉及到2個(gè)坐標(biāo)系的概念,一個(gè)是世界坐標(biāo),一個(gè)是局部坐標(biāo)。 如果一個(gè)物體沒有父物體,也就是說它的父物體就是“世界”,那么它的當(dāng)前坐標(biāo)就是世界坐標(biāo); 如果一個(gè)物體有父物體,那么它除了有世界坐標(biāo)以外,還有一個(gè)相對(duì)于父物體的相對(duì)坐標(biāo)。 例如: 父物體的世界坐標(biāo)是(1,0,0),子物體的世界坐標(biāo)是(0,1,0),那么子物體相對(duì)于父物體的局部坐標(biāo)就是(-1,1,0) 3、每一個(gè)點(diǎn)的蒙皮權(quán)重 之前我們記錄頂點(diǎn)信息和骨骼信息時(shí),都是已經(jīng)排好序的,所以我們?cè)谟涗浢善?quán)重的時(shí)候,就可以只是記錄各自的序號(hào),還有對(duì)應(yīng)的權(quán)重。一個(gè)頂點(diǎn)原則上是可以受到無限多根骨骼的影響,不過在實(shí)際的應(yīng)用中,為了不讓計(jì)算過于復(fù)雜,一般一個(gè)頂點(diǎn)最多只會(huì)受到4根骨骼的影響。 4、關(guān)鍵幀數(shù)據(jù) 根據(jù)記錄骨骼坐標(biāo)的坐標(biāo)系不同,可以選擇記錄每一根骨骼的絕對(duì)坐標(biāo),也可以記錄有動(dòng)畫的骨骼的相對(duì)坐標(biāo)。 根據(jù)是否計(jì)算插值,可以選擇記錄每一幀的信息,也可以選擇只記錄關(guān)鍵幀的信息,還有關(guān)鍵幀的插值方式。 之前我們介紹了絕對(duì)坐標(biāo)和相對(duì)坐標(biāo),如果是記錄世界坐標(biāo),那是最準(zhǔn)確的,但由于每一根骨骼的每一幀都需要去記錄,不管它是否做過動(dòng)畫,這樣動(dòng)畫的數(shù)據(jù)量會(huì)比較大。如果記錄的是相對(duì)坐標(biāo),那么如果在子物體沒有做動(dòng)畫的情況下,它就不需要記錄,而是通過父物體的坐標(biāo)來計(jì)算出子物體的世界坐標(biāo)。這樣做可以讓導(dǎo)出的數(shù)據(jù)容量很小。不過這會(huì)增加解析時(shí)候的運(yùn)算量。使用哪一種方式記錄關(guān)鍵幀,需要根據(jù)自己的項(xiàng)目實(shí)際情況來決定。 五、骨骼動(dòng)畫的計(jì)算原理 1、4*4矩陣的概念 對(duì)于骨骼關(guān)鍵幀的記錄,我們需要記錄位移(xyz)、旋轉(zhuǎn)(通常用四元數(shù)xyzw)、縮放(xyz)這么多個(gè)數(shù)據(jù)。我們計(jì)算的時(shí)候也可以逐個(gè)點(diǎn)去分別計(jì)算他們的位移旋轉(zhuǎn)縮放來做動(dòng)畫。不過骨骼動(dòng)畫一般會(huì)涉及到坐標(biāo)系的轉(zhuǎn)換,所以我們通常會(huì)都用矩陣來做運(yùn)算。 一般的矩陣運(yùn)算都是3*3矩陣,但在做3D方面的運(yùn)算時(shí),通常會(huì)把矩陣擴(kuò)展為4*4矩陣。具體的做法請(qǐng)參考矩陣的基礎(chǔ)知識(shí)。大概過程是,先通過旋轉(zhuǎn)和縮放算出3*3矩陣,然后再增多一個(gè)維度填上位移坐標(biāo)。 根據(jù)矩陣左乘和右乘的不同,你的矩陣可能不一樣,下面的公式是以左乘為基礎(chǔ)的。 不同的引擎不同的作者,可能使用不同的矩陣相乘規(guī)則,由于矩陣相乘是不滿足交換律的,也就是AB!=BA,所以一開始必須先搞清楚當(dāng)前的引擎矩陣究竟是左乘還是右乘的,還有坐標(biāo)系是用左手坐標(biāo)系,還是右手坐標(biāo)系。形式轉(zhuǎn)換經(jīng)常是錯(cuò)誤的根源。 經(jīng)過位移旋轉(zhuǎn)縮放的計(jì)算,或者直接從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)縮放計(jì)算的矩陣,tx、ty、tz是位移 2、坐標(biāo)系轉(zhuǎn)換概念 之前說過,骨骼有世界坐標(biāo)和局部坐標(biāo)的分部。其實(shí)所有東西都有絕對(duì)坐標(biāo)和相對(duì)坐標(biāo)的概念。 拿頂點(diǎn)和骨骼來說,頂點(diǎn)本身有世界坐標(biāo),也有相對(duì)于骨骼的相對(duì)坐標(biāo)。 關(guān)于絕對(duì)坐標(biāo)系和相對(duì)坐標(biāo)系的轉(zhuǎn)換,請(qǐng)參考3D圖形數(shù)學(xué)里面的坐標(biāo)系轉(zhuǎn)換。我只說簡(jiǎn)單的原理。 假設(shè)有:物體A和物體B,A的世界坐標(biāo)是Va世界,B的世界坐標(biāo)是Vb世界 現(xiàn)在我們需要把A的坐標(biāo)轉(zhuǎn)換成相對(duì)于B的相對(duì)坐標(biāo),記作Vab。 那么我們需要構(gòu)造一個(gè)矩陣M世界-b, Vab = Va世界*M世界-b。 其中M世界-b是根據(jù)Vb世界求出來的,一般是Vb世界的逆矩陣。 反過來,如果制定了A在B的相對(duì)坐標(biāo),也知道了B的實(shí)際坐標(biāo),我們需要求回A的世界坐標(biāo)。那么應(yīng)該是 Va世界= Vab*Mb-世界。 其中Mb-世界矩陣就是M世界-b的逆矩陣。乘以逆矩陣的幾何含義,就是把之前做過的變換取消掉。 一定要先把這個(gè)矩陣轉(zhuǎn)換坐標(biāo)系的概念搞清楚,這其實(shí)就是整個(gè)骨骼動(dòng)畫的原理關(guān)鍵。其中的A就是物體的頂點(diǎn),B就是骨骼。 3、骨骼動(dòng)畫原理 前面廢話了這么多,終于到核心部分了。 我們先從最簡(jiǎn)單的情況考慮。 假設(shè)我們的模型只有一個(gè)頂點(diǎn),骨骼也只有一根,這個(gè)頂點(diǎn)完全受這根骨骼的影響。 紅色點(diǎn)是頂點(diǎn),藍(lán)色的線是骨骼,這里把骨骼畫成線只是為了便于敘述,其實(shí)骨骼是沒有長(zhǎng)度概念的。 我們旋轉(zhuǎn)了骨骼,由于頂點(diǎn)完全受骨骼影響,所以頂點(diǎn)的坐標(biāo)也發(fā)生了變化。 那么我們?cè)鯓忧蟪鲰旤c(diǎn)在動(dòng)畫之后的坐標(biāo)呢? 通過觀察,頂點(diǎn)在動(dòng)畫前和后后,雖然實(shí)際坐標(biāo)發(fā)生了變化,但是相對(duì)于骨骼的相對(duì)坐標(biāo)是沒有發(fā)生變化的。只要知道了相對(duì)坐標(biāo),再通過動(dòng)畫后骨骼的坐標(biāo),就能通過轉(zhuǎn)換坐標(biāo)系,得到動(dòng)畫后頂點(diǎn)的世界坐標(biāo)了。 那么,我們可以這么做: 設(shè): 頂點(diǎn)的動(dòng)畫前世界坐標(biāo)為:V世界0 頂點(diǎn)在動(dòng)畫后世界坐標(biāo)為:V世界1 骨骼的動(dòng)畫前世界坐標(biāo)為:B世界0 骨骼在動(dòng)畫后世界坐標(biāo)為:B世界1 然后通過B世界0可以計(jì)算出從世界坐標(biāo)轉(zhuǎn)換到骨骼相對(duì)坐標(biāo)的:M0世界-b 通過B世界1可以計(jì)算出從骨骼相對(duì)坐標(biāo)轉(zhuǎn)換到世界坐標(biāo)的:M1b-世界 然后,我們要求出V世界1 首先求出頂點(diǎn)相對(duì)于骨骼的相對(duì)坐標(biāo)Vb: Vb = V世界0*M世界-b 然后當(dāng)運(yùn)動(dòng)之后,我們就可以求得 V世界1=Vb*M1b-世界 那么整個(gè)過程就是 V世界1 = V世界0*M世界-b*M1b-世界 看似過程有點(diǎn)復(fù)雜,其實(shí)Vb是固定的,我們甚至可以在導(dǎo)出數(shù)據(jù)的時(shí)候就先算好了。到了真正需要做動(dòng)畫的時(shí)候,我們只需要再知道一個(gè)B世界1,就足夠我們算出當(dāng)前的頂點(diǎn)應(yīng)該在的位置了。 我們?cè)偌哟髲?fù)雜程度: 假設(shè)頂點(diǎn)還是一個(gè),但骨骼變成了2根,頂點(diǎn)受a骨骼0.75權(quán)重的影響,受b骨骼0.25的影響 我們需要做的和前面一樣,雖然骨骼變成兩根了,但我們可以先忽略了權(quán)重,分別求出V世界1a和V世界1b。 之后的事情就很簡(jiǎn)單了: V世界1 = V世界1a*0.75+V世界1b*0.25。 如此類推,把權(quán)重標(biāo)記成W,就變成了 V世界1 = V世界1a*Wa+V世界1b*Wb+V世界1c*Wc+V世界1c*Wc 4、骨骼動(dòng)畫的整個(gè)工作流程: 1
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年個(gè)人車位出租合同樣本(2篇)
- 服裝公司辦公室裝修合同
- 商業(yè)地產(chǎn)租賃居間協(xié)議樣本
- 保健食品配送合同范本
- 2025年度信息安全保密技術(shù)合作開發(fā)合同
- 人工智能監(jiān)理居間合同
- 服裝批發(fā)市場(chǎng)物流合同
- 橡膠行業(yè)融資居間合同范例
- 2025年度安防產(chǎn)品區(qū)域代理及市場(chǎng)推廣合同
- 2025年度信息安全保密合作協(xié)議
- 游泳館安全隱患排查
- 《媒介社會(huì)學(xué)》課件
- 項(xiàng)目設(shè)計(jì)報(bào)告范文高中
- 成人手術(shù)后疼痛評(píng)估與護(hù)理團(tuán)體標(biāo)準(zhǔn)
- zemax-優(yōu)化函數(shù)說明書
- 2021年《民法典擔(dān)保制度司法解釋》適用解讀之擔(dān)保解釋的歷程
- 第02講 導(dǎo)數(shù)與函數(shù)的單調(diào)性(學(xué)生版)-2025版高中數(shù)學(xué)一輪復(fù)習(xí)考點(diǎn)幫
- 《醫(yī)療機(jī)構(gòu)工作人員廉潔從業(yè)九項(xiàng)準(zhǔn)則》專題解讀
- 成立商會(huì)的可行性報(bào)告5則范文
- 湖南財(cái)政經(jīng)濟(jì)學(xué)院《常微分方程》2023-2024學(xué)年第一學(xué)期期末試卷
- 游戲賬號(hào)借用合同模板
評(píng)論
0/150
提交評(píng)論