OpenGL中glVertex2f函数与gluOrtho2D的参数的对应关系,以及常见函数的对应坐标系

两个函数的函数原型如下:

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函数(即默认整个窗口为视口)时,我们用鼠标将窗口拖大、缩小时,里面之前画的正方形会跟着窗口的变化一起变化,以至于会成为一个矩形的原因。

原文地址:https://www.cnblogs.com/ymy124/p/2381075.html