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。