1. 程式人生 > >Skinned Mesh 原理解析和一個最簡單的實現示例

Skinned Mesh 原理解析和一個最簡單的實現示例

Mesh space 是建模時使用的空間, mesh 中頂點的位置相對於這個空間的原點定義。比如在 3d max 中建模時(視 xy 平面為地面, +z 朝上),可將模型兩腳之間的中點作為 Mesh 空間的原點,並將其放置在世界原點,這樣左腳上某一頂點座標是( 10 10 2 ),右腳上對稱的一點座標是( -10 10 2 ),頭頂上某一頂點的座標是( 0 0 170 )。由於此時 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 和每塊骨骼的相對位置,只是這個位置是間接的通過和世界座標空間的關係表達的,在初始位置將骨骼按照模型的形狀擺好是關鍵之處。