所有的這幾個函數的本質都是對座標系的操作。
前提知識:
1。每一種矩陣對應著一種座標系。見圖一
2。每一次對矩陣的操作都是對當前矩陣進行的。確切的說,作為一種狀態機器,每一時刻在矩陣方面只能有一種狀態。
3。每一次壓棧和出棧都對應著一種對座標系的操作。
4。我們所有對矩陣的操作都是對矩陣棧的棧頂矩陣進行的。
圖一
全域座標系中有一個局部座標系,這個座標系的狀態對應著一種矩陣。假如當前矩陣為該矩陣,則該矩陣為矩陣棧中的棧頂元素。假如此時又進行了一系列glTranslate(),glRotatef()等操作,都是對當前矩陣也就是棧頂矩陣進行了修改。若此時調用glPushMatrix()函數,則將該矩陣壓入棧中第二層的位置,當然此時棧頂位置的矩陣也與此矩陣相同。
當進行完一系列變換之後,棧頂矩陣為該矩陣。若此時調用glPopMatrix()函數,則恢複當前矩陣為該座標系的狀態。以前所進行的有關修改都被忽略了。
記住一句話,所有對矩陣進行的操作都是對棧頂矩陣進行的,壓進去的矩陣式哪個矩陣,當前矩陣就是哪個矩陣,彈出來的是哪個矩陣,當前矩陣就為哪個矩陣。
記住:一個矩陣對應一個局部座標系。
glPushMatrix
pushes the current matrix stack down by one, duplicating the current matrix. That is, after a
glPushMatrix call, the matrix on top of the stack is identical to the one below it.
見圖二:
圖二
glMatrixMode()的作用就是指定當前操作的矩陣為哪一個矩陣。總共有三種參數類型
1。GL_PROJECTION 表示當前操作的矩陣為透視矩陣,用於設定視景體的矩陣
2.GL_MODEVIEW 表示當前操作的矩陣為模型視點矩陣,用於對三維情境中座標系的變換操作。
摘自:
http://wylikang.blog.163.com/blog/static/162869843201061792234968/