在OpenGL中更改投影

我在调整GLUT窗口大小时遇到​​了麻烦。 我想打印一个矩形但是当我使用resizefunction时,我似乎无法在窗口中绘制和塑造。 我有以下代码,当我调整窗口大小时我想改变方形的宽度,但如果高度resize,我不希望它的高度改变。

#include  #include  #include  /* globals */ GLsizei wh = 500, ww = 500; /* initial window size */ GLfloat size = 3.0; /* half side length of square */ void myinit(void) { glClearColor(0.0,0.0,1.0,1.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0,1,0,1.0,-1.0,1.0); glViewport(0,0,ww,wh); } /* display callback -- required by GLUT 3.0 */ void renderScene(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3f(1.0,.5,.7); glBegin(GL_POLYGON); glVertex3f (0.25, 0.25, 0.0); glVertex3f (0.75, 0.25, 0.0); glVertex3f (0.75, 0.75, 0.0); glVertex3f (0.25, 0.75, 0.0); glEnd(); glFlush(); } void mouse(int button, int state, int x, int y) { if(button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN) { glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0.0,500,0.0,500,0.0,1.0); } } /*app quits if q is pressed*/ void keyboard(unsigned char key, int x, int y) { if(key == 'Q' | key == 'q') exit(0); } /* The main program -- note that there is no "flow of control" -- the program merely calls functions to handle interactions */ int main(int argc, char** argv) { glutInit(&argc, argv); glutInitWindowSize(ww,wh); glutInitWindowPosition(100,100); glutCreateWindow("Square"); myinit(); glutMouseFunc(mouse); glutKeyboardFunc(keyboard); glutDisplayFunc(renderScene); //glutReshapeFunc(changeSize); glutMainLoop(); return 0; } 

我做了一个测试changeSize函数,当我使用它时,它只会显示一个没有矩形的空蓝色窗口

您的问题在于使用正交矩阵的固定值:

glOrtho(0.0,500,0.0,500,0.0,1.0);

这就是说,无论窗口大小如何,都将0顶点位置映射到窗口的底部, 500映射到窗口的顶部。

因此,如果你有一个500像素的高窗口,并且你绘制一个覆盖100个单位的正方形,这将映射到窗口中的100个像素。

但是,如果将窗口拉伸为1000像素高,现在您有一个0到500的区域映射到高度为1000像素的窗口。 因此,过去用于覆盖100像素高度的同一个正方形现在可以覆盖200像素的高度。

如果在resize时希望它始终具有相同的大小,则需要更新正交矩阵以将更大的区域映射到新的更大的窗口。 因此,如果您将正交矩阵更改为将区域0 to windowHeight映射0 to windowHeight到窗口,则100个单位的正方形将始终填充完全相同的高度。

 glOrtho( 0.0, //left 500, //right 0.0, //bottom height_in_pixels, //top 0.0, //near 1.0); //far