下載下面的VC工程並運行它(glut0.zip)(這個就是上一節的工程)。你將看到兩個視窗:一個控制台視窗,一個OpenGL視窗。現在改變視窗大小使高度與寬度不再相等,這時三角形發生變形。這會發生是因為你沒有正確設定投影矩陣。預設的是透視投影矩陣且高寬比為1.因此高寬比改變了,投影就會變形。因此只要高寬比改變了,投影就應該重新計算。
GLUT定義了當視窗大小改變時哪一個函數應該被調用。此外,這個函數還會在視窗初次被建立時調用,保證初始化視窗不是正方形的時候渲染也不會變形出錯。
這個函數是glutReshapeFunc()。
void glutReshapeFunc(void(*func)(int width,int height));
參數:
func: 指負責設定正確投影的函數的名稱。
因此我們必須做的第一件事是回到main()函數。在上一章的代碼裡加入對glutReshapeFunc()的調用,讓我們把負責視窗尺寸的函數叫做changeSize。現在的代碼如下。
void main(int argc, char **argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_SINGLE | GLUT_RGBA);
glutInitWindowPosition(100,100);
glutInitWindowSize(320,320);
glutCreateWindow("3D Tech- GLUT Tutorial");
glutDisplayFunc(renderScene);
// Here is our new entry in the main function
glutReshapeFunc(changeSize);
glutMainLoop();
}
下面我們需要做的就是定義函數changeSize()。從glutReshapeFunc()函數的聲明可以看到,changSize()函數有兩個形參。。這兩個參數代表新的視窗高度和寬度。
void changeSize(int w, int h) {
// 防止除數即高度為0
// (你可以設定視窗寬度為0).
if(h == 0)
h = 1;
float ratio = 1.0* w / h;
// 單位化投影矩陣。
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// 設定視口大小為增個視窗大小
glViewport(0, 0, w, h);
// 設定正確的投影矩陣
gluPerspective(45,ratio,1,1000);
//下面是設定模型視圖矩陣
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0,0.0,5.0, 0.0,0.0,-1.0,0.0f,1.0f,0.0f);
}
我們在上一小段代碼裡引進了一些函數。下面讓我們詳細講解,以免讓你感到很迷茫。
第一步是計算高寬比(wight/height)。注意為了計算正確,我們必須保證高度不為0。
接著,我們設定當前矩陣為投影矩陣,這個矩陣定義了一個可視空間(viewing volume)。
我們調用一個單位矩陣來初始化投影矩陣。然後我們用函數glViewport把視口設定為整個視窗。你也可以設定不同的值。函數中(0,0)指定了視口的左下角,(w,h)指定了視口矩形的大小。注意這個座標是和用戶端區域有關的,而不是螢幕座標。。
gluPerspective函數是其他OpenGL庫(GLU庫)裡的一個函數。(gluPerspective函數的參數,設定請參見其他書籍。我並不想在GLUT講解裡再加入其他一些OpenGL內容的講解。)
最後就是設定模型觀測矩陣。調用GL_MODELVIEW把當前矩陣設為模型觀測矩陣。gluLookAt()也是GLU庫裡的一個函數,其參數詳細設定參見其他書籍。
下面是這章的VC工程(glut1.zip),你可以自己設定大小,改變參數值。要真正弄懂程式究竟是怎樣啟動並執行。
(本人翻譯水平有限,錯誤之處望指正,謝謝)
文章來源:http://www.lighthouse3d.com/opengl/glut/index.php?3