OpenGL學習三——矩陣堆棧

      在計算機圖形學中,所有的變換都是通過矩陣相乘實現的,即物體定點構成的齊次座標矩陣乘以三維變換矩陣就可得到變換後的物體齊次座標矩陣。同樣,在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();

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章