兩個函數的函數原型如下:
glVertex(GLfloat x, GLfloat y);
gluOrtho2D(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top);
簡單的說前者的兩個參數所代表的坐標點,必須落在后者參數所形成的坐標系內,不然該點就在viewport之外。
舉個例子:
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glPointSize(9);
glBegin(GL_POINTS);
glVertex2f(67.0,67.0);//6行
glEnd();
glFlush();
}
void init()
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-70.0,70.0,-70.0,70.0);//第十四行
}
如果第8行改為glVertex2f(80.0,80.0)這時就看不到這個點了。
在沒有設置gluOrtho2D函數的情況下(2維的情況),默認為窗口的中心是(0,0),而到矩形的邊的最遠距離為0;參數大於0則該點又看不到了。
同時,在這里也憑平時的經驗總結一下opengl中的一些函數的參照坐標
glViewport函數:它的原點(0,0)在所生產的窗口的坐下角。
gluOrtho,glBegin,glEnd函數:它們的原點是glViewport在glutCreatWindow函數所產生的窗口的上的投影(即視口)的中心。比如說畫一個點glVertex2i(0,0),在沒設置gluOrtho函數(即默認時),這個點在窗口的正中間。
glutMouseFunc(mymouse):此時鼠標指針的原點(0,0)在視口的最左上角。
參考坐標這么多,畫圖時我們腦海中想要畫的圖到底該怎么轉換到窗口里去呢?個人認為,先假設沒有設置視口(viewport),即glCreateWindow函數產生的那個窗口整個就是視口(viewport)。然后窗口的中心即是gluOrtho函數的原點,用gluOrtho函數裁剪窗口,然后就用glBegin一系列的函數畫圖(在所裁剪的窗口上),畫完后圖形已經固定,再考慮用glViewport函數將圖形在glCreatWindow函數所產生的窗口上進行投影。假設剛才的裁剪窗口是一個正方形,你畫的圖形也是個正方形而視口(viewport)也是個正方形,那么最后在窗口中生成的圖形也是個正方形如果畫的是正方形,裁剪窗口也是正方形,但視口(viewport)不是一個正方形那最后得到的也不是一正方形,這就是為什么在沒有設置glViewport函數(即默認整個窗口為視口)時,我們用鼠標將窗口拖大、縮小時,里面之前畫的正方形會跟着窗口的變化一起變化,以至於會成為一個矩形的原因。