我有一个正方形,我试图让它在调整窗口大小时保持正方形,而不是用窗口拉伸。我有一些我认为可行的代码,但是当我调整窗口大小时,方块缩小并消失。当我将窗口恢复到原始大小时,它不会回来。有人能告诉我我做错了什么以及如何解决它?
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POLYGON);
glVertex2f(-0.5, -0.5);
glVertex2f(-0.5, 0.5);
glVertex2f(0.5, 0.5);
glVertex2f(0.5, -0.5);
glEnd();
glFlush();
return;
}
void reshape(int w, int h) {
const float aspectRatio = ((float)w) / h;
float xSpan = 1;
float ySpan = 1;
if (aspectRatio > 1) {
xSpan *= aspectRatio;
}
else {
ySpan *= aspectRatio;
}
gluOrtho2D(-1*xSpan, xSpan, -1*ySpan, ySpan);
glViewport(0, 0, w, h);
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutCreateWindow("simple");
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMainLoop();
}
答案 0 :(得分:1)
函数gluOrtho2D
和glOrtho
将当前矩阵乘以新的正交投影矩阵。
这导致如果gluOrtho2D
被第二次调用,之前由glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-1*xSpan, xSpan, -1*ySpan, ySpan);
设置的矩阵乘以新的矩阵,您将获得连续的变化。
您必须通过glLoadIdentity
“重置”矩阵堆栈上的矩阵(初始化标识矩阵)。此外,您应该按glMatrixMode
选择投影矩阵堆栈:
gluOrtho2D
视口glViewport
的设置是正确的,您还可以正确考虑宽高比(在ySpan /= aspectRatio;
中)。但如果纵横比小于1.0则存在问题。它应该是display
我建议在reshape
函数中设置视口和投影矩阵,只是在bool vp_valid = true;
int width, height;
void reshape(int w, int h) {
vp_valid = false;
width = w;
height = h;
}
void display(void)
{
if (!vp_valid)
{
const float aspectRatio = (float)width / height;
float sx = aspectRatio > 1.0f ? aspectRatio : 1.0f;
float sy = aspectRatio > 1.0f ? 1.0f : 1.0f/aspectRatio;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-sx, sx, -sy, sy);
glViewport(0, 0, width, height);
}
.....
}
函数中设置通知标志。请注意,视口和投影矩阵应尽可能少地更改。
totalmorango