我在调整GLUT窗口大小时遇到了问题。我想打印一个矩形但是当我使用调整大小功能时,我似乎无法在窗口中绘制和塑造。我有以下代码,当我调整窗口大小时我想改变方形的宽度,但如果高度调整大小,我不希望它的高度改变。
#include <GLUT/glut.h>
#include <stdio.h>
#include <stdlib.h>
/* 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函数,当我使用它时,它只显示一个没有矩形的空蓝色窗口
答案 0 :(得分:3)
您的问题在于使用正交矩阵的固定值:
glOrtho(0.0,500,0.0,500,0.0,1.0);
这就是说,无论窗口多大,都将0
的顶点位置映射到窗口的底部,500
映射到窗口的顶部。
因此,如果你有一个500像素高的窗口,并且你绘制一个覆盖100个单位的正方形,这将映射到窗口中的100个像素。
但是,如果将窗口拉伸到1000像素高,现在您有一个0到500的区域映射到高度为1000像素的窗口。因此,过去用于覆盖100像素高度的同一个正方形现在可以覆盖200像素的高度。
如果在调整大小时希望它始终具有相同的大小,则需要更新正交矩阵以将更大的区域映射到新的更大的窗口。因此,如果您更改拼写矩阵以将区域0 to windowHeight
映射到窗口,则100个单位的正方形将始终填充完全相同的高度。
glOrtho( 0.0, //left
500, //right
0.0, //bottom
height_in_pixels, //top
0.0, //near
1.0); //far