opengl中圖形繪制后,往往需要一系列的變換來達(dá)到用戶的目的,而這種變換實(shí)現(xiàn)的原理是又通過矩陣進(jìn)行操作的。opengl中的變換一般包括視圖變換、模型變換、投影變換等,在每次變換后,opengl將會(huì)呈現(xiàn)一種新的狀態(tài)(這也就是我們?yōu)槭裁磿?huì)稱其為狀態(tài)機(jī))。
首先我們要知道,對(duì)于矩陣的操作都是對(duì)于矩陣棧的棧頂來操作的。當(dāng)前矩陣即為矩陣棧的棧頂元素,而對(duì)當(dāng)前矩陣進(jìn)行平移、旋轉(zhuǎn)等的變換操作也同樣是對(duì)棧頂矩陣的修改。所以我們?cè)谧儞Q之前調(diào)用glPushMatrix()的話,就會(huì)把當(dāng)前狀態(tài)壓入第二層,不過此時(shí)棧頂?shù)木仃囈才c第二層的相同。
當(dāng)經(jīng)過一系列的變換后,棧頂矩陣被修改,此時(shí)調(diào)用glPopMatrix()時(shí),棧頂矩陣被彈出,且又會(huì)恢復(fù)為原來的狀態(tài)。
函數(shù)的作用過程可以用下圖描述,更為直觀。

如上圖,從第一個(gè)圖狀態(tài)1到第二個(gè)圖狀態(tài)2調(diào)用了glPushMatrix()方法,此時(shí)矩陣棧的第一個(gè)和第二個(gè)的狀態(tài)是一樣的,但是平移、旋轉(zhuǎn)等方法都是對(duì)棧頂元素操作的,在經(jīng)過平移,旋轉(zhuǎn)之后棧頂?shù)臓顟B(tài)1變?yōu)?strong>狀態(tài)2,此時(shí)對(duì)狀態(tài)2再進(jìn)行某些繪制,在調(diào)用glPopMatrix()彈棧,就相當(dāng)于在狀態(tài)1的情況下繪制了。
那么這么做有什么意義呢?
對(duì)于某些復(fù)雜的繪制,比如一個(gè)3D迷宮,障礙是很多墻壁,墻壁是由很多個(gè)立方體構(gòu)成了,我們需要繪制大量的立方體,但是立方體的位置是分布在不同地方的,如果我們每繪制一個(gè)立方體都要移動(dòng)到相應(yīng)的位置,無疑是十分困難的,但是如果我們先調(diào)用glPushMatrix(),在把所有的立方體都移動(dòng)到中心,然后在繪制, 在調(diào)用glPopMatrix(),把這個(gè)立方體彈棧,返回原來的位置,我們就只需要一個(gè)簡單的for循環(huán)就可以做到。此時(shí),可以簡單的把glPushMatrix()和glPopMatrix()方法理解為移動(dòng)到指定位置,在移動(dòng)回來;當(dāng)然,這兩個(gè)方法不僅僅適用于移動(dòng)。相應(yīng)的理解就是旋轉(zhuǎn)相應(yīng)的角度在旋轉(zhuǎn)回來。
在opengl場景中一般存在多種矩陣變換操作,而控制這些操作的命令主要用到
glMatrixMode(GLenum mode);
作用:用于指定用哪個(gè)矩陣作為當(dāng)前矩陣,mode用于指定哪一種矩陣棧是其后矩陣操作的目標(biāo)。
mode可?。?br>
GL_MODELVIEW: 把其后的矩陣操作施加于模型視圖矩陣棧。(默認(rèn))
GL_PROJECTION: 把其后的矩陣操作施加于投影矩陣棧。
GL_TEXTURE: 把其后的矩陣操作施加于紋理矩陣棧。
注意上述三種模式分別對(duì)應(yīng)了三種矩陣棧。 所以在場景中存在多種矩陣變換時(shí),glPushMatrix()和glPopMatrix()一般情況下也要結(jié)合glMatrixMode(GLenum mode)運(yùn)用,系統(tǒng)才知道具體操作的是哪個(gè)矩陣棧。
注釋:
1.模型視圖矩陣是在對(duì)物體進(jìn)行縮放或者從不同的視角觀察物體的時(shí)候所調(diào)用的。主要涉及到三個(gè)函數(shù):
進(jìn)行模型和視圖變換,主要涉及到三個(gè)函數(shù):
(1)glTranslate(x,y,z),把當(dāng)前矩陣和一個(gè)表示移動(dòng)物體的矩陣相乘。三個(gè)參數(shù)分別表示了在三個(gè)坐標(biāo)上的位移值。
(2)glRotate(angle,x,y,z),把當(dāng)前矩陣和一個(gè)表示旋轉(zhuǎn)物體的矩陣相乘。物體將繞著(0,0,0)到(x,y,z)的直線以逆時(shí)針旋轉(zhuǎn),參數(shù)angle表示旋轉(zhuǎn)的角度。
(3)glScale(x,y,z),把當(dāng)前矩陣和一個(gè)表示縮放物體的矩陣相乘。x,y,z分別表示在該方向上的縮放比例。
2.投影矩陣是定義一個(gè)可視空間,可視空間以外的物體不會(huì)被繪制到屏幕上。投影分為正投影和透視投影
**(1)透視投影常見的方法:
gluPerspective
gluLookAt
(2)正投影常見的方法:
glOrtho
**
