3D動(dòng)畫
提供一種機(jī)制,描述各定點(diǎn)位置隨時(shí)間的變化
骨骼動(dòng)畫簡(jiǎn)介
-
頂點(diǎn)動(dòng)畫
早期的3D模型動(dòng)畫,就是把每幀的頂點(diǎn)數(shù)據(jù)輸出到文件中,所以3D模型的一個(gè)動(dòng)作就是一系列的模型,這樣做的目的主要是硬件資源有限,沒(méi)有多余的時(shí)間去計(jì)算頂點(diǎn)。
- 骨骼動(dòng)畫
隨著動(dòng)畫越來(lái)越精細(xì),將每幀的頂點(diǎn)數(shù)據(jù)輸出到文件數(shù)據(jù)量太大。人們想出一種辦法,將3D模型抽象為一些關(guān)鍵點(diǎn)的集合,整個(gè)模型的運(yùn)動(dòng)可以當(dāng)做是這些關(guān)鍵點(diǎn)的運(yùn)動(dòng),而模型的頂點(diǎn)只是受這些關(guān)鍵點(diǎn)的影響而已。這些關(guān)鍵點(diǎn)就稱為骨骼

skinned mesh
利用vertex blend(頂點(diǎn)混合),對(duì)于關(guān)節(jié)附近的點(diǎn),由多段骨骼影響,對(duì)不同骨骼賦予不同的權(quán)值。目前我們所使用的最大受骨骼影響數(shù)為4.
更加真實(shí),靈活
制作效率高
運(yùn)行時(shí)交互
共享動(dòng)畫
要求一定的性能
骨架父子關(guān)系,父骨骼帶動(dòng)子骨骼運(yùn)動(dòng)
骨骼帶動(dòng)頂點(diǎn)運(yùn)動(dòng)
程序?qū)用?/h1>
- 肘關(guān)節(jié)動(dòng)->手臂動(dòng)
- 肩關(guān)節(jié)動(dòng)->手臂動(dòng)
- 身體的肉動(dòng)是由一系列關(guān)節(jié)的運(yùn)動(dòng)所影響,但影響的程度不同
class Point
{
float x,y,z; //頂點(diǎn)的位置
int Bone[n]; //影響肌肉的骨頭
float Weight[n] //每一個(gè)骨頭對(duì)頂點(diǎn)的影響度,例如 肘關(guān)節(jié)的影響度對(duì)手臂很多,而肩關(guān)節(jié)要少。
}
class Point
{
float x,y,z; //頂點(diǎn)的位置
int Bone[n]; //影響肌肉的骨頭
float Weight[n] //每一個(gè)骨頭對(duì)頂點(diǎn)的影響度,例如 肘關(guān)節(jié)的影響度對(duì)手臂很多,而肩關(guān)節(jié)要少。
}
那么一個(gè)頂點(diǎn)的位置就是:
for( int i = 0 ;i < n ; ++ i)
{
(x,y,z) += 骨頭[i] * 骨頭的影響度[i];
}
骨頭在程序上的意義是什么,其可以旋轉(zhuǎn),有位移,有縮放,其實(shí)就是矩陣
制作過(guò)程
rigging:創(chuàng)建骨骼的過(guò)程
skinning : 把點(diǎn)映射到骨骼的過(guò)程
static 3D model -> rigging - skinning -> animation
數(shù)據(jù)格式

解析過(guò)程
- 頂點(diǎn)數(shù)據(jù)中要有骨頭信息和骨頭權(quán)重
- c3t文件中要有完整的骨架信息
- nodes數(shù)據(jù)中要有網(wǎng)格對(duì)應(yīng)的骨頭信息,骨頭的坐標(biāo)空間轉(zhuǎn)換的逆矩陣
關(guān)鍵幀
Sprite3D draw
skeleton->updateBoneMatrix
meshSkin getMatrixPalette world matrix * invPos
將palette矩陣傳到shader
animation信息改變Bone‘s local Matrix
