骨骼蒙皮動(dòng)畫(Skinned-Mesh)的原理解析(二)_第1頁
骨骼蒙皮動(dòng)畫(Skinned-Mesh)的原理解析(二)_第2頁
骨骼蒙皮動(dòng)畫(Skinned-Mesh)的原理解析(二)_第3頁
骨骼蒙皮動(dòng)畫(Skinned-Mesh)的原理解析(二)_第4頁
骨骼蒙皮動(dòng)畫(Skinned-Mesh)的原理解析(二)_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

骨骼蒙皮動(dòng)畫(SkinnedMesh)的原理解析(二)2)蒙皮信息和蒙皮過程2-1)Skininfo的定義上文曾討論過,SkinnedMesh中Mesh是作為皮膚使用,蒙在骨骼之上的。為了讓普通的Mesh具有蒙皮的功能,必須添加蒙皮信息,即Skininfo。我們知道Mesh是由頂點(diǎn)構(gòu)成的,建模時(shí)頂點(diǎn)是定義在模型自身坐標(biāo)系的,即相對(duì)于Mesh原點(diǎn)的,而骨骼動(dòng)畫中決定模型頂點(diǎn)最終世界坐標(biāo)的是骨骼,所以要讓骨骼決定頂點(diǎn)的世界坐標(biāo),這就要將頂點(diǎn)和骨骼聯(lián)系起來,Skininfo正是起了這個(gè)作用。下面是DEMO中頂點(diǎn)類的定義的代碼片段:#defineMAX_BONE_PER_VERTEX4

//用來設(shè)置可同時(shí)影響該頂點(diǎn)的最大骨骼數(shù)classVertex{floatm_x,m_y,m_z;//localposinmeshspacefloatm_wX,m_wY,m_wZ;//blendedvertexpos,inworldspace//skininfointm_boneNum;

//影響該頂點(diǎn)的骨骼數(shù)目Bone*m_bones[MAX_BONE_PER_VERTEX];

//指向這些骨骼的指針floatm_boneWeights[MAX_BONE_PER_VERTEX];

//這些骨骼作用于該點(diǎn)的權(quán)重};頂點(diǎn)的Skininfo包含影響該頂點(diǎn)的骨骼數(shù)目,指向這些骨骼的指針,這些骨骼作用于該頂點(diǎn)的權(quán)重(Skinweight)。由于只是一個(gè)簡單的例子,這兒沒有考慮優(yōu)化,所以用靜態(tài)數(shù)組存放骨骼指針和權(quán)重,且實(shí)際引擎中Skininfo的定義方式不一定是這樣的,但基本原理一致。MAX_BONE_PER_VERTEX在這兒用來設(shè)置可同時(shí)影響頂點(diǎn)的最大骨骼數(shù),實(shí)際上由于這個(gè)DEMO是手工進(jìn)行VertexBlending并且也沒用硬件加速,可影響頂點(diǎn)的骨骼數(shù)量并沒有限制,只是恰好需要一個(gè)常量來定義數(shù)組,所以定義了一下。在實(shí)際引擎中由于要使用硬件加速,以及為了確保速度,一般會(huì)定義最大骨骼數(shù)。另外在本DEMO中,Skininfo是手工設(shè)定的,而在實(shí)際項(xiàng)目中,一般是在建模軟件中生成這些信息并導(dǎo)出。Skininfo的作用是使用各個(gè)骨骼的變換矩陣對(duì)頂點(diǎn)進(jìn)行變換并乘以權(quán)重,這樣某塊骨骼只能對(duì)該頂點(diǎn)產(chǎn)生部分影響。各骨骼權(quán)重之和應(yīng)該為1。Skininfo是針對(duì)頂點(diǎn)的,然而在使用Skininfo前我們必須要使用BoneOffsetMatrix對(duì)頂點(diǎn)進(jìn)行變換,下面具體討論BoneoffsetMatrix。(寫下這句話的時(shí)候我感覺有些不妥,因?yàn)閷?shí)際是先將所有的矩陣相乘最后再作用于頂點(diǎn),這兒是按照理論上的順序進(jìn)行講述吧,請(qǐng)不要與實(shí)際情況混淆,其實(shí)他們也并不矛盾。而且在我們的DEMO中由于沒有使用矩陣,所以變換的順序和理論順序是一致的)2-2)BoneOffsetMatrix的含義和計(jì)算方法上文已經(jīng)說過:“骨骼動(dòng)畫中決定模型頂點(diǎn)最終世界坐標(biāo)的是骨骼,所以要讓骨骼決定頂點(diǎn)的世界坐標(biāo)”,現(xiàn)在讓我們看下頂點(diǎn)受一塊骨骼的作用時(shí)的坐標(biāo)變換過程:meshvertex(definedinmeshspace)---<BoneOffsetMatrix>--->Bonespace---<BoneCombinedTransformMatrix>--->World從這個(gè)過程中可看出,需要首先將模型頂點(diǎn)從模型空間變換到某塊骨骼自身的骨骼空間,然后才能利用骨骼的世界變換計(jì)算頂點(diǎn)的世界坐標(biāo)。BoneOffsetMatrix的作用正是將模型從頂點(diǎn)空間變換到骨骼空間。那么BoneOffsetMatrix如何得到呢?下面具體分析:Meshspace是建模時(shí)使用的空間,mesh中頂點(diǎn)的位置相對(duì)于這個(gè)空間的原點(diǎn)定義。比如在3dmax中建模時(shí)(視xy平面為地面,+z朝上),可將模型兩腳之間的中點(diǎn)作為Mesh空間的原點(diǎn),并將其放置在世界原點(diǎn),這樣左腳上某一頂點(diǎn)坐標(biāo)是(10,10,2),右腳上對(duì)稱的一點(diǎn)坐標(biāo)是(-10,10,2),頭頂上某一頂點(diǎn)的坐標(biāo)是(0,0,170)。由于此時(shí)Mesh空間和世界空間重合,上述坐標(biāo)既在Mesh空間也在世界空間,換句話說,此時(shí)實(shí)際是以世界空間作為Mesh空間了。在骨骼動(dòng)畫中,在世界中放置的是骨骼而不是Mesh,所以這個(gè)區(qū)別并不重要。在3dmax中添加骨骼的時(shí)候,也是將骨骼放入世界空間中,并調(diào)整骨骼的相對(duì)位置使得和mesh相吻合(即設(shè)置骨骼的TransformMatrix),得到骨架的初始姿勢(shì)以及相應(yīng)的TransformMatrix(按慣例模型做成兩臂側(cè)平舉直立,骨骼也要適合這個(gè)姿態(tài))。由于骨骼的TransformMatrix(作用是將頂點(diǎn)從骨骼空間變換到上層空間)是基于其父骨骼空間的,只有根骨骼的Transform是基于世界空間的,所以要通過自下而上一層層Transform變換(如果使用行向量右乘矩陣,這個(gè)Transform的累積過程就是C=Mbone*Mfather*Mgrandpar*...*Mroot),得到該骨骼在世界空間上的變換矩陣-CombinedTransformMatrix,即通過這個(gè)矩陣可將頂點(diǎn)從骨骼空間變換到世界空間。那么這個(gè)矩陣的逆矩陣就可以將世界空間中的頂點(diǎn)變換到某塊骨骼的骨骼空間。由于Mesh實(shí)際上就是定義在世界空間了,所以這個(gè)逆矩陣就是OffsetMatrix。即OffsetMatrix就是骨骼在初始位置(沒有經(jīng)過任何動(dòng)畫改變)時(shí)將bone變換到世界空間的矩陣(CombinedTransformMatrix)的逆矩陣,有一些資料稱之為InverseMatrix。在幾何流水線中,是通過變換矩陣將頂點(diǎn)變換到上層空間,最終得到世界坐標(biāo),逆矩陣則做相反的事,所以Inverse這種提法也符合慣例。那么Offset這種提法從字面上怎么理解呢?Offset即骨骼相對(duì)于世界原點(diǎn)的偏移,世界原點(diǎn)加上這個(gè)偏移就變成骨骼空間的原點(diǎn),同樣定義在世界空間中的點(diǎn)經(jīng)過這個(gè)偏移矩陣的作用也被變換到骨骼空間了。從另一角度理解,在動(dòng)畫中模型中頂點(diǎn)的位置是根據(jù)骨骼位置動(dòng)態(tài)計(jì)算的,也就是說頂點(diǎn)跟著骨骼動(dòng),但首先必須確定頂點(diǎn)和骨骼之間的相對(duì)位置(即頂點(diǎn)在該骨骼坐標(biāo)系中的位置),一個(gè)骨骼可能對(duì)應(yīng)很多頂點(diǎn),如果要保存這個(gè)相對(duì)位置每個(gè)頂點(diǎn)對(duì)于每塊受控制的骨骼都要保存,這樣就要保存太多的矩陣了。。。所以只保存mesh空間到骨骼空間的變換(即OffsetMatrix),然后通過這個(gè)變換計(jì)算每個(gè)頂點(diǎn)在該骨骼空間中的坐標(biāo),所以O(shè)ffsetMatrix也反應(yīng)了mesh和每塊骨骼的相};這個(gè)函數(shù)使用一塊骨骼對(duì)頂點(diǎn)進(jìn)行變換,將頂點(diǎn)從Mesh坐標(biāo)系變換到世界坐標(biāo)系,這兒使用了骨骼的BoneOffsetMatrix和CombinedTransformMatrix(嗯,我知道這兒沒用矩陣,但意思是一樣的對(duì)嗎)對(duì)于多塊骨骼,對(duì)每塊骨骼執(zhí)行這個(gè)過程并將結(jié)果根據(jù)權(quán)重混合(即vertexblending)就得到頂點(diǎn)最終的世界坐標(biāo)。進(jìn)行vertexblending的代碼如下:classVertex{voidBlendVertex(){//dothevertexblending,getthevertex'sposinworldspacem_wX=0;m_wY=0;m_wZ=0;for(inti=0;i<m_boneNum;++i){floattx,ty,tz;ComputeWorldPosByBone(m_bones[i],tx,ty,tz);tx*=m_boneWeights[i];ty*=m_boneWeights[i];tz*=m_boneWeights[i];m_wX+=tx;m_wY+=ty;m_wZ+=tz;}}};這些函數(shù)我都放在Vertex類中了,因?yàn)橹皇且粋€(gè)簡單DEMO所以沒有特別考慮引擎結(jié)構(gòu)問題,在BlendVertex()中,遍歷影響該頂點(diǎn)的所有骨骼,用每塊骨骼計(jì)算出頂點(diǎn)的世界坐標(biāo),然后使用SkinWeight對(duì)這些坐標(biāo)進(jìn)行加權(quán)平均。tx,ty,tz是某塊骨骼作用后頂點(diǎn)的世界坐標(biāo)乘以權(quán)重后的值,這些值相加后就是最終的世界坐標(biāo)了?,F(xiàn)在讓我們用一個(gè)公式回顧一下Vertexblending的整個(gè)過程(使用矩陣變換)Vworld=Vmesh*BoneOffsetMatrix1*CombindMatrix1*Weight1+Vmesh*BoneOffsetMatrix2*CombinedMatrix2*Weight2+…+Vmesh*BoneOffsetMatrixN*CombindMatrixN*WeightN(這個(gè)公式使用的是行向量左乘矩陣)由于BoneOffsetMatrix和CombinedMatrix都是矩陣,可以先相乘這樣就減少很多計(jì)算了,在實(shí)際PC游戲中可以使用VS進(jìn)行硬件加速計(jì)算。3)動(dòng)畫數(shù)據(jù)和播放動(dòng)畫正如前面所說,本例子中并沒有使用動(dòng)畫數(shù)據(jù),但動(dòng)畫數(shù)據(jù)在骨骼動(dòng)畫中確實(shí)最重要的,因?yàn)槲覀兊淖罱K目的就是播放動(dòng)畫。所以作為DEMO的補(bǔ)充,這兒簡要討論一下動(dòng)畫數(shù)據(jù)相關(guān)問題。其實(shí)我覺得動(dòng)畫的處理在骨骼動(dòng)畫中是很靈活的,需要專門的一篇文章討論。本文的最開始說,3D模型動(dòng)畫的基本原理是讓模型中各頂點(diǎn)的位置隨時(shí)間變化。骨骼動(dòng)畫的情況是,骨骼的位置隨時(shí)間變化,頂點(diǎn)位置隨骨骼變化。所以動(dòng)畫數(shù)據(jù)中必然包含的是骨骼的運(yùn)動(dòng)信息??梢栽趧?dòng)畫幀中包含某時(shí)刻骨骼的TransformMatrix,但骨骼一般只是做旋轉(zhuǎn),所以也可以用一個(gè)四元數(shù)表示。但有時(shí)候骨骼層次整體會(huì)在動(dòng)畫中進(jìn)行平移,所以可能需要在動(dòng)畫幀中包含根骨骼的位置信息。播放動(dòng)畫時(shí),給出當(dāng)前播放的時(shí)間值,對(duì)于每塊需要?jiǎng)赢嫷墓趋?,根?jù)這個(gè)值找出該骨骼前后兩個(gè)關(guān)鍵幀,根據(jù)時(shí)間差進(jìn)行插值,對(duì)于四元數(shù)要使用四元數(shù)球面插值。然后將插值得到的四元數(shù)轉(zhuǎn)換成TransformMatrix,再調(diào)用UpdateBoneMatrix(其含義上文已介紹)更新計(jì)算整個(gè)骨骼層次的CombinedMatrix。4)總結(jié)從結(jié)構(gòu)上看,SkinnedMesh包括:動(dòng)畫數(shù)據(jù),骨骼數(shù)據(jù),包含Skininfo的Mesh數(shù)據(jù),以及BoneOffsetMatrix。從過程上看,載入階段:載入并建立骨骼層次

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論