1. 程式人生 > >openGL如何在改變窗口大小時,使自己的圖形不被拉伸

openGL如何在改變窗口大小時,使自己的圖形不被拉伸

open 必須 最小 bsp 空間 rspec mod 變形 chang

這裏要註意兩個概念:視口和視景體,當視口的縱橫比和視景體的縱橫比相同的時候,改變窗口大小,圖像才不會變形;

視景體是指成像景物所在空間的集合。它是一個空間集合體。

單個的視景體,比如一個球體,若要完全顯示,其視景體應該是該球體的最小外接立方體;若要只顯示上半部分,則取上半球,其視景體是上半球的最小外接立方體。對於半球而言,上半球是視景體,那麽其只有上半球有顯示權限,下半球沒有,所以就算是將該球體位置拉遠,也只能看到上半球。

若視景體僅僅為上半球,那麽默認情況下,上半球所映射的畫布剛好充滿攝像機。將攝像機下移,則攝像機畫面中顯示的是上半球切面的水平線,水平線以下是黑色背景色。即使此時從理論上來說攝像機對著下半球,但由於視景體僅為上半球,所以下半球是沒有顯示權限的,是不會被顯示的。

對OpenGL而言,視景體就意味著可顯示空間,在該空間內的一切物體都可以被顯示,都可以被看到,該空間外的一切物體都不能被看到。相機若要看到該空間中的物體,則相機本身就必須處於該視景體空間中。若相機在視景體空間外,哪怕該視景體就在相機正對的面前,相機依然無法看到

例如:
控制視口大小為:glViewprot(0,0,400,200);則其縱橫比為2
那麽控制視景體的參數為:gluPerspective(fovy,2,near,far);可以了

添加代碼如下:

 1 void changeSize(GLsizei w, GLsizei h)
 2 {
 3     if (h == 0)
 4         h = 1
; 5 glViewport(0, 0, w, h); 6 glMatrixMode(GL_PROJECTION); 7 glLoadIdentity(); 8 9 if (w <= h) 10 { 11 glOrtho(0.0f, 300.0f, 0.0f, 300.0f * h / w, 1.0f, -1.0f); 12 } 13 else 14 { 15 glOrtho(0.0f, 300.0f * w / h, 0.0f, 300.0f, 1.0f, -1.0f); 16 } 17 18 glMatrixMode(GL_MODELVIEW);
19 glLoadIdentity(); 20 }

註意:繪制圖形時需要使用像素坐標系,左下角為原點。例如:glRectf(100.0f, 100.0f, 200.0f, 200.0f); 而不是glRectf(-0.5f, -0.5f, 0.5f, 0.5f);

openGL如何在改變窗口大小時,使自己的圖形不被拉伸