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