三維變換到二維投影_OpenGL版本

摘自:http://fred.easymorse.com/?p=296   (註明:已經打不開了,我是通過網頁快照看到的)

從三維物體到二維圖象,就如同用相機拍照一樣,通常都要經歷以下幾個步驟:
  1、將相機置於三角架上,讓它對準三維景物,它相當於OpenGL中調整視點的位置,即視點變換(Viewing Transformation)。
  2、將三維物體放在場景中的適當位置,它相當於OpenGL中的模型變換(Modeling Transformation),即對模型進行旋轉、平移和縮放。
  3、選擇相機鏡頭並調焦,使三維物體投影在二維膠片上,它相當於OpenGL中把三維模型投影到二維屏幕上的過程,即OpenGL的投影變換(Projection Transformation),OpenGL中投影的方法有兩種,即平行投影和透視投影。爲了使顯示的物體能以合適的位置、大小和方向顯示出來,必須要通過投影。
  4、沖洗底片,決定二維相片的大小,它相當與OpenGL中的視口變換(Viewport Transformation)(在屏幕窗口內可以定義一個矩形,稱爲視口(Viewport),視景體投影后的圖形就在視口內顯示)規定屏幕上顯示場景的範圍和尺寸。

視圖變換和模型變換這兩種變換可以互相替換,比如你不必移動相機(視圖變換)來觀察場景,而是通過移動場景(模型變換)。

在代碼中,視圖變換必須放在模型變換之前,但可以在繪圖之前的任何時候執行投影變換和視口變換。視圖變換函數gluLookAt()和模型變換函數glTranslate()等通常放在函數display()中,而視口變換函數glViewport()和投影函數glFrustum()等放在reshape()中。

模型變換:將頂點座標從世界座標系變換到視覺座標系的過程。世界座標系,也稱爲全局座標系。可以認爲該座標系是固定不變的。在初始態下,其x軸爲沿屏幕水平向右,y軸爲沿屏幕垂直向上,z軸則爲垂直屏幕面向外指向用戶。長度單位定義爲,窗口範圍按此單位恰好是(-1,-1)到(1,1)。世界座標是OpenGL中用來描述場景的座標,相當於場景固定不變。用世界座標系來描述物體及光源的位置。視覺座標系,也稱爲局部座標系。該座標系是可以活動的。在初始態下,其原點及x,y 軸分別與世界座標系的原點及x,y 軸重合,而z 軸則正好相反,即爲垂直屏幕面向內。當前繪圖座標系是繪製物體時的座標系,就是模型座標系。程序剛初始化時,世界座標系和當前繪圖座標系是重合的。當用glTranslatef(),glScalef(), glRotatef()對當前繪圖座標系進行平移、伸縮、旋轉變換之後,世界座標系和當前繪圖座標系不再重合。改變以後,再用繪圖函數繪圖時,都是在當前繪圖座標系進行繪圖,所有的函數參數也都是相對當前繪圖座標系來講的。OpenGL 中有一個座標變換矩陣棧(ModelView),棧頂就是當前座標變換矩陣,進入OpenGL管道的每個座標(齊次座標)都會先乘上這個矩陣,結果纔是對應點在場景中的世界座標。OpenGL中的座標變換都是通過矩陣運算完成的,要注意的是變換中的矩陣乘法是左乘。

考察下面利用三個變換繪製頂點的代碼:
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glMultMatrixf(N);
glMultMatrixf(M);
glMultMatrixf(L);
glBegin(GL_POINTS);
glVertex3f(v);
glEnd();
glMultMatrix()函數,它表示把當前矩陣與參數表示的矩陣相乘並賦給當前矩陣。C是當前矩陣,glMultMatrix(M)後的當前矩陣爲C*M。在這個過程中,GL_MODELVIEW狀態相繼引入了I(單位陣)、N、M、L矩陣。變換後的頂點爲NMLv。因此,頂點的變換爲N(M(Lv)),即是先作變換L,然後是變換M,最後纔是N。這裏,頂點v的實際變換順序正好與指定的順序相反。

矩陣棧操縱命令:
glPushMatrix();當前矩陣入棧,這時矩陣棧將棧頂值壓入棧。
glPopMatrix();棧頂出棧,通常與上一條命令配合使用。
glLoadIdentity();將棧頂設爲不變矩陣(就是對角線全爲1其它爲0的那個)。
glMultMatrix(M);將棧頂T設爲M·T。

gluOtho2d()
剪裁面,類似照相機取景,在無限的空間中取出想要的一部分景色。

glViewPort()
指定一個剪裁面後,需要在窗口中顯示出來。我們先取景(就是用gluOrtho2D()剪出來的剪裁面),然後在我們定義的窗口中選一個區域來顯示這個取好的景。

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