OpenGL基本概念入門3——矩陣變換

來源:互聯網
上載者:User

1 平移

glTranslatef(x,y,z);    其中,x,y,z分別表示在X、Y、Z軸上平移的量

2 旋轉

與平移類似,OpenGL也為我們提供了一個進階函數用於旋轉物體:

glRotatef(Angle,x,y,z);

這個函數將產生並應用一個將座標系以向量(x,y,z)為軸,旋轉angle個角度的矩陣。

3 縮放

縮放變換其實是將座標系的x、y、z軸按不同的縮放因子展寬,從而實現縮放效果。函數

glScalef(x,y,z);

把座標系的X、Y、Z軸分別縮放x、y、z倍。

4 變換的疊加性質

使用變換時,我們應該注意的是,變換是疊加在上次變換的基礎上的。也就是說,變換的效果會累積。每次調用變換函數時,會產生一個新的函數來乘以當前的模型視圖矩陣,隨後,新的矩陣將成為當前的模型變換矩陣,在下次執行變換時,會被新的矩陣相乘,因此作用效果將不斷累積。

我們可以調用glLoadIdentity();函數將當前模型視圖變換矩陣重設到初始狀態,再進行新的繪製。如:

void RenderScene()

{

glMatrixMode(GL_MODELVIEW);

//沿Y軸向上平移10個單位

glTranslatef(0,10,0);

//畫第一個球體

DrawSphere(5);

//載入單位矩陣

glLoadIdentity();

//沿X軸向上平移10個單位

glTranslatef(10,0,0);

//畫第二個球體

DrawSphere(5);

}

5 矩陣堆棧

如果每次變換前都把當前矩陣恢複到單位矩陣,也比較麻煩。更多時候,我們希望儲存當前矩陣,執行一些變換之後,把當前矩陣恢複到上次儲存時的狀態。

OpenGL為我們提供了一個“矩陣堆棧”滿足我們的這種要求。我們可以把當前矩陣壓入堆棧中,然後執行一些變換,再彈出剛才壓入的矩陣,從而把當前矩陣恢複到上次變換之前的狀態。我們調用

glPushMatrix();

把當前矩陣壓入矩陣堆棧,調用

glPopMatrix();

彈出矩陣。我們還可以分別調用

glGet(GL_MAX_MODELVIEW_STACK_DEPTH);

glGet(GL_MAX_PROJECTION_STACK_DEPTH);

來擷取模型視圖矩陣堆棧和投影矩陣堆棧的最大堆棧深度。一般情況下(在Windows平台上),模型視圖的最大堆棧深度是32,而投影堆棧的最大深度是2。

使用矩陣堆棧上例中的程式可以改寫為:

void RenderScene()

{

glMatrixMode(GL_MODELVIEW);

//推入矩陣堆棧

glPushMatrix();

//沿Y軸向上平移10個單位

glTranslatef(0,10,0);

//畫第一個球體

DrawSphere(5);

//恢複到上次儲存時的狀態

glPopMatrix();

//沿X軸向左平移10個單位

glTranslatef(10,0,0);

//畫第二個球體

DrawSphere(5);

}

6.投影矩陣

設定投影矩陣往往在OpenGL繪圖和模型視圖變換之前。一般情況下,我們調用

glMatrixMode(GL_PROJECTION);

將當前矩陣設定為投影矩陣。再調用

glOrtho 或 gluPerspective 來建立平行或透視投影。建立完後,再調用

glMatrixMode(GL_MODELVIEW);

將當前變換矩陣設定為模型視圖變換矩陣。

7. 定義和使用自己的變換

除了使用OpenGL為我們提供的幾個進階變換函數之外,我們還可以自己建立一個矩陣,並使用當前矩陣乘以該矩陣來進行特殊的變換。你可以建立一個4×4的二維數組用於描述一個矩陣。如:

Float M[4][4];

其中M[j,i]表示矩陣M的第j行,第i列的資料。

你也可以建立一個一維數組:

Float M[16];

無論是2維數組還是一維數組,都是按照列優先的順序儲存的。

 

 

矩陣定義完後,調用

glLoadMatrix(M);

可以用矩陣M替換當前矩陣,調用

glMultMatrix(M);

用當前矩陣乘以矩陣M。

要說明的是,使用glLoadMatrix或glMultMatrix的速度沒有OpenGL的進階變換函數快。所以如果不是進階變換函數完成不了的變換,就不要使用glLoadMatrix或者glMultMatrix。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.