簡單的例程,這一例程將給展示乙個最初級的人物動畫,具備多細節內容
以人走路為例子,當人走路的從乙個站立開始,到邁出一步,這個過程是
乙個連續的過程,在這個乙個過程中,人身體的骨頭在位置在發生變化,
骨頭發生變化以後,人的**,肌肉就隨著變化,上乙個例程中我們計算
(opengl10-骨骼動畫原理篇(1))計算了根據骨頭的位置計算**的位置
只是計算量一刻的動作,走路的過程是連續的,就意味著我們要記錄下來
骨頭在運動過程中所以位置變化資料,這樣才可以根據不同時刻的骨骼的
位置計算出來**的位置。
計算,我們要記錄非常多的骨頭的資訊,小下面這樣:
假設人有100個骨頭
bone person[100]
一秒鐘60幀 × 5秒 × 100,這個就是我們要記錄的資料量,由此可見
資料量是非常大的,實際上大可不必這樣做,想一,是否可以記錄乙個
關鍵幀的,其他的資料又關鍵幀來計算呢 ?假設我們記錄了10個關鍵點
其他的資料根據時間按照一定的插值演算法進行插值,那麼資料量就驟然
降低非常多呢。出於這樣的想法,我們增加了乙個新的概念,關鍵幀。
骨骼動畫系統的流程如下:
下面我們使用程式的角度來描述下該問題:
1. 獲取到所有的骨骼資料(可使用矩陣儲存)
bone bones[n];
2. 獲取到關鍵幀資料
bone arkeyframe[n][keynumber];
3 獲取到**(頂點資料)
vertex verts[vnumber];
4 通過插值計算出來新的骨骼位置
bone timebone[n];
5 根據計算出來骨骼來計算頂點資料
vert temp[vnumber];
乙個定點的宣告如下:
struct vertex ;
宣告乙個類,儲存骨頭的資訊.類如下所示,該類儲存動畫的所有骨格資訊:
struct接下來,宣告一動畫類,動畫類中維護關鍵幀資料vertex
;
class乙個動畫類,用來儲存所有的關鍵幀資料,提供計算骨頭插值演算法,frame
;
並輸出一幀的骨骼資料,類如下所示。
class呼叫方式如下:skinanimation
//! 該動畫有兩個關鍵幀
frame _keyframe[2
];};
/*然後我們將定點資料與計算出來的骨骼資料計算,得出最後的**資料:* * 產生時間
*/static
float *** = 0
;
/*** 根據關鍵幀計算出來新的骨骼位置
*/_skinanima.calcframe(***,frame);
*** += 0.01f;
/*最後將計算出來的資料給opengl,進行繪製了:** 繪製表皮,儲存臨時點資料
* 這裡根據新的骨頭的(就是插值計算出來以後的骨頭來計算**的位置了)
*/vertex calquadvertices[
12];
memcpy(calquadvertices,g_quadvertices,
sizeof
(g_quadvertices));
for (int i = 0 ;i < 12 ; ++i )
calquadvertices[i].x =vec.x;
calquadvertices[i].y =vec.y;
calquadvertices[i].z =vec.z;
}
glcolorpointer(4,gl_float,sizeof可執行檔案以及**(vertex),calquadvertices);
glvertexpointer(
3,gl_float,sizeof(vertex),((float*)calquadvertices) + 4
);for (int i = 0 ;i < 3 ; ++i )
OpenGL 10 加入顏色屬性來繪製三色三角形
include include include const char vertexshadersource version 330 core n layout location 0 in vec3 apos n 位置變數的屬性位置值為 0 layout location 1 in vec3 acol...
OpenGL學習10 OpenGL光照
在opengl模型中,除非乙個物體自己會發光,否則它將受到3中不同的光照射 環境光 ambient 散射光 diffuse 和鏡面光 specular 現實世界中,當然不存在這樣的光,但是,作為光抽象,這三種型別的光允許我們模擬和控制光照在物體表面上所產生的主要型別的效果。1 環境光 環境光並不是來...
NO 10 嫿骨 記天數小玩意
部分執行結果 另簡述一下switch的語法,switch支援哪些型別的值 什麼是switch的穿透 實際開發中 通常哪些判斷使用if 哪些判斷使用switch switch 是一種選擇結構的語句,用來代替簡單的 擁有多個分枝的 if else 語句,基本格式如下 switch 表示式 它的執行過程是...