说明

默认情况下,中心点在屏幕的中心,范围都是从[-1,1],所以物体的实际坐标映射到屏幕坐标需要一个转换过程,上文中描述到使用gluOrtho2D函数通过正投影,将物理坐标映射到屏幕坐标,但是坐标的原点在左下角,一般情况下,屏幕的原点都是从左上角开始,因此在上述的所有例子中,都需要重新计算Y轴的坐标,屏幕的高减去点Y轴分量。现在通过重新设置正射投影的左下角坐标和右上角的坐标,建立一一对应的关系,而不再需要进行任何的转换,类似于旋转相机,达到调整坐标系的作用


代码

#include <gl/glut.h>

#include <Windows.h>


#define WINDOWHEIGHT 480

#define WINDOWWIDTH 800


void myInit()

{

glClearColor(1.0,1.0,1.0,0.0);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

//gluOrtho2D(0.0, WINDOWWIDTH, 0.0, WINDOWHEIGHT);

gluOrtho2D(0.0, WINDOWWIDTH , WINDOWHEIGHT, 0.0);

}


void myDisplay(void)

{

glClearColor(1.0f, 1.0f, 1.0f, 0.0f);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glFlush();

}


void myMouse(int button,int state,int x,int y)

{

if(state==GLUT_DOWN)

{

glPointSize(10);

glBegin(GL_POINTS);

glColor3f(1.0f, 0.0f, 0.0f);

//glVertex2f(x, WINDOWHEIGHT-y);

glVertex2f(x, y);

glEnd();

glFlush();

}

}


int main(int argc, char* argv[])

{

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_RGBA | GLUT_SINGLE);

glutInitWindowSize(WINDOWWIDTH, WINDOWHEIGHT);

glutInitWindowPosition(100,150);

glutCreateWindow("OpenGL 窗口1");

glutDisplayFunc(&myDisplay);

glutMouseFunc(&myMouse);

myInit();

glutMainLoop();

return 0;

}