1. 程式人生 > >骨骼蒙皮動畫(Skinned Mesh)的原理解析

骨骼蒙皮動畫(Skinned Mesh)的原理解析

是建模時使用的空間,mesh中頂點的位置相對於這個空間的原點定義。比如在3d max中建模時(視xy平面為地面,+z朝上),可將模型兩腳之間的中點作為Mesh空間的原點,並將其放置在世界原點,這樣左腳上某一頂點座標是(10102),右腳上對稱的一點座標是(-10102),頭頂上某一頂點的座標是(00170)。由於此時Mesh空間和世界空間重合,上述座標既在Mesh空間也在世界空間,換句話說,此時實際是以世界空間作為Mesh空間了。在骨骼動畫中,在世界中放置的是骨骼而不是Mesh,所以這個區別並不重要。在3d max中新增骨骼的時候,也是將骨骼放入世界空間中,並調整骨骼的相對位置使得和mesh
相吻合(即設定骨骼的TransformMatrix),得到骨架的初始姿勢以及相應的Transform Matrix(按慣例模型做成兩臂側平舉直立,骨骼也要適合這個姿態)。由於骨骼的Transform Matrix(作用是將頂點從骨骼空間變換到上層空間)是基於其父骨骼空間的,只有根骨骼的Transform是基於世界空間的,所以要通過自下而上一層層Transform變換(如果使用行向量右乘矩陣,這個Transform的累積過程就是C=Mbone*Mfather*Mgrandpar*...*Mroot,得到該骨骼在世界空間上的變換矩陣 - Combined Transform Matrix
,即通過這個矩陣可將頂點從骨骼空間變換到世界空間。那麼這個矩陣的逆矩陣就可以將世界空間中的頂點變換到某塊骨骼的骨骼空間。由於Mesh實際上就是定義在世界空間了,所以這個逆矩陣就是Offset Matrix。即OffsetMatrix就是骨骼在初始位置(沒有經過任何動畫改變)時將bone變換到世界空間的矩陣(CombinedTransformMatrix)的逆矩陣,有一些資料稱之為InverseMatrix。在幾何流水線中,是通過變換矩陣將頂點變換到上層空間,最終得到世界座標,逆矩陣則做相反的事,所以Inverse這種提法也符合慣例。那麼Offset這種提法從字面上怎麼理解呢?Offset即骨骼相對於世界原點的偏移,世界原點加上這個偏移就變成骨骼空間的原點,同樣定義在世界空間中的點經過這個偏移矩陣的作用也被變換到骨骼空間了。從另一角度理解,在動畫中模型中頂點的位置是根據骨骼位置動態計算的,也就是說頂點跟著骨骼動,但首先必須確定頂點和骨骼之間的相對位置(即頂點在該骨骼座標系中的位置),一個骨骼可能對應很多頂點,如果要儲存這個相對位置每個頂點對於每塊受控制的骨骼都要儲存,這樣就要儲存太多的矩陣了。。。所以只儲存mesh
空間到骨骼空間的變換(即OffsetMatrix),然後通過這個變換計算每個頂點在該骨骼空間中的座標,所以OffsetMatrix也反應了mesh和每塊骨骼的相對位置,只是這個位置是間接的通過和世界座標空間的關係表達的,在初始位置將骨骼按照模型的形狀擺好是關鍵之處。