OpenGL學習三 矩陣堆疊

2021-06-01 03:14:07 字數 976 閱讀 8532

在計算機圖形學中,

所有的變換都是通過矩陣相乘實現的,即物體定點構成的齊次座標矩陣乘以三維變換矩陣就可得到變換後的物體齊次座標矩陣。同樣,在opengl中圖遠的座標變換(移動、旋轉、縮放)也是通過矩陣乘法實現的。opengl中比較重要的矩陣有投影矩陣和模型檢視矩陣,外加紋理矩陣。矩陣堆疊基於矩陣引入,它可以以棧的形式儲存相應的矩陣,壓入和彈出操作同普通的棧,三種矩陣對應了三個矩陣堆疊。

實際上在建立、裝入、相乘模型檢視變換和投影變換矩陣時都已經用到了矩陣堆疊。拿模型檢視變換來說,在繪製複雜的場景時,會涉及到複雜的模型矩陣變換,常常我們需要儲存這些變換的中間狀態,以便在進行一些變換後快速恢復,而無需對當前模型矩陣進行反變換以進行恢復(費時)。比如,當前模型檢視矩陣狀態為矩陣a,場景繪製需要模型檢視矩陣從a->b,然後從a->c......。利用矩陣堆疊,程式只需要儲存矩陣a(glpushmatrix),執行完a->b後,恢復模式檢視矩陣為a(glpopmatrix),執行變換a->c。很顯然,使用矩陣堆疊比僅使用單個矩陣效率高很多。

函式glpushmatrix用於將當前矩陣壓入矩陣堆疊(由函式glmatrixmode指定堆疊型別),即:該函式複製棧頂矩陣(比如矩陣a),並放置在棧頂(a『),這樣矩陣堆疊頂部有兩個相同的矩陣,棧頂矩陣作為當前矩陣進行後續變換。函式glpushmatrix彈出棧頂矩陣(a『),下面乙個元素變為棧頂(a),即恢復之前的模型檢視狀態。切記:當前矩陣永遠位於堆疊頂部。矩陣堆疊是有深度的,如果壓入過多矩陣或者堆疊只有乙個矩陣而呼叫glpopmatrix將導致錯誤。

**示例:

glmatrixmode(gl_modeview); // set cur matrix mode

glpushmatrix(); // push cur matrix

gltranslatef(*);

glrotatef(*);

glscalef(*);

drawobject();

glpopmatrix();

opengl矩陣堆疊的常識

1,實際上在opengl中對於乙個已經存在的矩陣 m 此時在畫點 c 旋轉 r 都是 mc 或者 mr在glmultmatrixf t 中也是已經存在的矩陣 m t 2 在opengl中有時需要獲取乙個矩陣內容而返回的是乙個指標,但是這個指標指向的記憶體轉為二維陣列時,與c或者c 中一維陣列轉二維陣...

OpenGL學習07 OpenGL矩陣

關於矩陣的概念和矩陣的計算本篇就不再多說了,不了解的同學可以翻一下大學數學了!矩陣 matrix 是一種很強大的數學工具,特別實在計算機圖形處理中,它可以極大的簡化變數之間的複雜關係的乙個或多個方程式的求解。例如 空間中有乙個點座標x y z,如果當這個點圍繞任意點以任意方向旋轉一定的座標之後,想知...

OpenGL入門學習(三)

在第二課中,我們學習了如何繪製幾何圖形,但大家如果多寫幾個程式,就會發現其實還是有些鬱悶之處。例如 點太小,難以看清楚 直線也太細,不舒服 或者想畫虛線,但不知道方法只能用許多短直線,甚至用點組合而成。這些問題將在本課中被解決。下面就點 直線 多邊形分別討論。1 關於點 點的大小預設為1個畫素,但也...