因為各種變換都是以矩陣方式儲存的, 對於連續的儲存、變換、反變換的排序, 矩陣堆疊提供了一種理想的機制。所有描述過的矩陣操作:
函式: glloadmatrix*();
glmultmatrix*();
glloadidentity();
gltranslate*();
glrotated();
glscale*();
glulookat();....
負責處理當前矩陣, 或者處理當前棧頂矩陣。程式設計師可以使用執行堆疊操作的函式控制哪個矩陣位於頂部。其中函式glpushmatrix() 確定位於棧頂的矩陣,及拷貝當前矩陣, 並將其拷貝矩陣壓入棧頂, 而函式glpopmatrix()用來刪除棧頂的矩陣。
實際上glpushmatrix表示 「記住你當前的位置」 , 而函式 glpopmatrix() 表示「回到原處」。
看一下下面的偽**:
void draw_wheel_and_bolts()
}void draw_body_and_wheel_and_bolts()
模型檢視矩陣堆疊:
模型檢視矩陣是檢視變換矩陣和模型變換矩陣乘積的累積結果。每乙個檢視或者模型變換都要產生乙個新的矩陣, 它與當前的模型檢視矩陣相乘, 相乘得到的結果成為新的當前矩陣。程式設計師可以通過查詢函式glgetintegerv() 傳gl_max_modelview_stack_depth來得到堆疊中最大允許的矩陣數。
投影矩陣堆疊:
投影矩陣描述了檢視體。通常,我們不希望對投影矩陣進行合成,因此在投影變換之前應該呼叫glloadidentity()。同樣的原因, 投影矩陣堆疊深度只需要兩級深度。在特殊情況下, 也允許多於兩個, 可以呼叫glgetintegerv 傳 gl_max_projection_stack_depth,獲得堆疊深度。
附加裁剪平面:
除了檢視體的6個裁剪平面, 我們還可以定義6個附加的裁剪平面, 以便更嚴格地限制檢視體。
每個平面由方程ax +by + cz +d = 0 的係數a b c d所決定。裁剪平面根據模型變換和檢視變換,自動的進行適當的變換。裁剪結果為檢視體和所有附加裁剪平面定義的半空間的交集,且在切面上,opengl為自動的生成相應的邊。
glclipplane (glenum plane, const gldouble *equation);
equation 定義了平面方程4個係數的指標。m是當前檢視模型矩陣, 所有滿足 (a b c d)m^-1(xe, ye, ze, we)^ t > 0 的人眼座標(xe, ye, ze, we)的點都位於該平面所定義的半空間內。引數plane 為 gl_clip_planei i= [0,5]的自然數。
可以用glenable(gl_clip_planei) 來啟用附加平面。
8 事例八 矩陣堆疊和變換綜合
這個例子改編自 徐明亮的 opengl遊戲程式設計 這本書裡的乙個例子,原書例子是c 的 namespace sharpgltest08 private void openglcontrol opengldraw object sender,rendereventargs e public void...
opengl矩陣堆疊的常識
1,實際上在opengl中對於乙個已經存在的矩陣 m 此時在畫點 c 旋轉 r 都是 mc 或者 mr在glmultmatrixf t 中也是已經存在的矩陣 m t 2 在opengl中有時需要獲取乙個矩陣內容而返回的是乙個指標,但是這個指標指向的記憶體轉為二維陣列時,與c或者c 中一維陣列轉二維陣...
點的變換(矩陣轉化)
link 時間限制 2000 ms 記憶體限制 65535 kb 難度 5 描述 平面上有不超過10000個點,座標都是已知的,現在可能對所有的點做以下幾種操作 平移一定距離 m 相對x軸上下翻轉 x 相對y軸左右翻轉 y 座標縮小或放大一定的倍數 s 所有點對座標原點逆時針旋轉一定角度 r 操作的...