骨骼動畫原理

3D動畫

提供一種機制,描述各定點位置隨時間的變化

骨骼動畫簡介

  • 頂點動畫
    早期的3D模型動畫,就是把每幀的頂點數據輸出到文件中,所以3D模型的一個動作就是一系列的模型,這樣做的目的主要是硬件資源有限,沒有多余的時間去計算頂點。


  • 骨骼動畫
    隨著動畫越來越精細,將每幀的頂點數據輸出到文件數據量太大。人們想出一種辦法,將3D模型抽象為一些關鍵點的集合,整個模型的運動可以當做是這些關鍵點的運動,而模型的頂點只是受這些關鍵點的影響而已。這些關鍵點就稱為骨骼

skinned mesh

利用vertex blend(頂點混合),對于關節附近的點,由多段骨骼影響,對不同骨骼賦予不同的權值。目前我們所使用的最大受骨骼影響數為4.

  • 更加真實,靈活

  • 制作效率高

  • 運行時交互

  • 共享動畫

  • 要求一定的性能

  • 骨架父子關系,父骨骼帶動子骨骼運動

  • 骨骼帶動頂點運動

程序層面

  • 肘關節動->手臂動
  • 肩關節動->手臂動
  • 身體的肉動是由一系列關節的運動所影響,但影響的程度不同
class Point
{

  float x,y,z;     //頂點的位置

      int  Bone[n];  //影響肌肉的骨頭

      float Weight[n]  //每一個骨頭對頂點的影響度,例如 肘關節的影響度對手臂很多,而肩關節要少。

}

那么一個頂點的位置就是:

for( int i = 0 ;i < n ; ++ i)
{

   (x,y,z) += 骨頭[i] * 骨頭的影響度[i];

}

骨頭在程序上的意義是什么,其可以旋轉,有位移,有縮放,其實就是矩陣

制作過程

rigging:創建骨骼的過程
skinning : 把點映射到骨骼的過程

static 3D model -> rigging - skinning -> animation

數據格式

解析過程

  • 頂點數據中要有骨頭信息和骨頭權重
  • c3t文件中要有完整的骨架信息
  • nodes數據中要有網格對應的骨頭信息,骨頭的坐標空間轉換的逆矩陣

關鍵幀

  • Sprite3D draw

  • skeleton->updateBoneMatrix

  • meshSkin getMatrixPalette world matrix * invPos

  • 將palette矩陣傳到shader

  • animation信息改變Bone‘s local Matrix

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容