Directx11教程四十二上之SkeletalAnimation(骨骼動畫)的原理
阿新 • • 發佈:2019-02-18
這一節教程是關於如何用Directx11實現SkeletalAnimation(骨骼動畫)的,程式碼的結構如下:
一,骨骼動畫(SkeletalAnimation)
(1)骨骼的層級關係-----樹(Tree)
在談論SkeletalAnimation之前,我們先看看大名鼎鼎的虛幻四引擎的動畫系統中的Skeleton,如下圖所示:在上面圖左邊方框顯示的人物骨骼的層級關係圖,也就是右邊方框中的人物的各種黑色骨頭的層級關係圖。那麼人物的骨骼的層級關係圖是怎麼樣的?看著上面人物骨骼層級關係圖,其實很容易想到一個經典的資料結構,也就是“樹”,也就是說人物的各個骨頭之間呈現的為“子母關係”,這裡將每根骨頭都是“骨骼樹”中的一個節點,那麼除了根節點之外,其它節點都存在母節點,如圖中的骨骼“clavicle_l”就是骨骼“upperarm_l”的母節點。 假設骨骼A依據一個另外骨骼B為母節點,那麼B骨骼變換時,A骨骼也會相應進行變換。如下圖所示:
總體來看,各個骨骼之間的關係用一個圖來表示如下:
(2)骨骼變換的計算
假設我們有三個骨骼Bone0,Bone1,Bone2,這三個骨骼呈現的為下圖中的這樣的層級關係:3D模型檔案中,每根骨骼都存在其獨自的區域性空間座標系,就如同在3D模型檔案格式讀取的切線向量一開始是存在於TangnetSpace(切線空間)。當然,各個骨骼的座標系之間存在一定的關係的,這個與上面介紹的“骨骼層級關係--樹”是相關的。在很多3D檔案中,如M3D檔案,每根骨骼的Scale,Translation,Quat定義了其區域性空間的變換(Transform),這個變換有什麼用呢?這個變換允許我們將一個骨骼的座標系變換到其母骨骼的座標系中.
我們上面說過,在3D模型檔案中,每根骨骼定義的(由Translation,Scale,Quat組成)變換矩陣,負責把其獨自的座標系變換到其母骨骼的座標系。那麼依據這個原理,骨骼樹中的葉點代表的骨骼通過自底向上的計算,將其的座標系最終變換到根節點的母空間,而根節點的母空間就是根節點定義的變換矩陣將根節點的座標系變換到的空間,也就是我們3D渲染中的WorldSpace。 、
(3)SkinnedMesh(蒙皮網格)
下面圖展示了包圍著骨骼的人物的網格。人物的網格由大量的三角形片元構成,而構成三角形片元的頂點的位置則是由骨骼的變換矩陣所影響,這樣就造成了每幀骨骼動畫下,人物的網格出現了變換的結果。當然,一段動畫下,同一根骨骼在不同畫面幀下的變換矩陣是不一樣的,所以每幀畫面下構成了人物3D網格的每個三角形片元的頂點的位置自然不同了,這將在後面介紹3D動畫格式M3D詳細解釋。(4)平移變換(OffsetTransform)
在(3)中我們解釋了構成人物網格的三角形片元的頂點的位置被骨骼所影響,但是這裡的頂點有條件限制:指的是在繫結空間(BindSpace)。頂點的繫結空間,也就是3D模型被朔造所在的空間。而我們已經在(2)中求出每個骨骼變換到世界空間的矩陣,這裡假設第i個骨骼變換到世界空間的矩陣為ToRoot(i).這裡我們對頂點進行處理: 一,先把頂點變換到骨骼的區域性空間位置,也就是進行OffsetTransform(i) 二,將變換到骨骼區域性空間位置的頂點進行ToRoot的變換 如下圖所示:也就是頂點最終的變換矩陣為FinalMatrix=OffsetTransform(i)*ToRoot(i).
(5)VertexBlend(OffsetTransform)
為什麼是頂點混合?拿上面(3)和(4)的人物3D網格來當例子,用一句通俗的話來說,頂點混合就是一個頂點的變換是同時受到多個骨骼的影響。比如說,我們存在一個頂點VertexA,而存在四個骨骼Bone0,Bone1,Bone2,Bone3,並且這四個骨骼相應的最終變換矩陣為Bone0FinalMatrix,Bone1FinalMatrix,Bone2FinalMatrix,Bone3FinalMatrix。這裡假設VertexA被Bone0,Bone1,Bone2,Bone3所影響,並且被Bone0影響程度分別為Weight0, 被Bone1影響程度為Weight1, 被Bone2影響程度為Weight2, 被Bone3影響程度為Weight3. 這裡: weight0+weight1+weight2+weight3=1.0f那麼頂點混合起到什麼作用?其實這種以加權值混合的方式在3D圖形學非常常見,起到讓某種顯示效果平滑過度的作用。