C++ OpenGL在调整窗口大小时保持对象形状

C++ OpenGL在调整窗口大小时保持对象形状,c++,opengl,orthographic,C++,Opengl,Orthographic,我有一个正方形,我试图在调整窗口大小时使其保持正方形,而不是随着窗口拉伸。我有一些代码,我认为这将工作,但当我调整窗口的正方形收缩和消失。当我将窗口恢复到原来的大小时,它不会返回。有人能告诉我我做错了什么,以及如何修复它吗 void display(void) { glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_POLYGON); glVertex2f(-0.5, -0.5); glVertex2f(-0.5, 0.5);

我有一个正方形,我试图在调整窗口大小时使其保持正方形,而不是随着窗口拉伸。我有一些代码,我认为这将工作,但当我调整窗口的正方形收缩和消失。当我将窗口恢复到原来的大小时,它不会返回。有人能告诉我我做错了什么,以及如何修复它吗

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();
}
函数并将当前矩阵乘以新的正交投影矩阵。
这导致如果第二次调用
重塑
,则之前由
gluOrtho2D
设置的矩阵将与新矩阵相乘,并获得连续更改

您必须通过“重置”矩阵堆栈上的矩阵(初始化同一矩阵)。此外,应通过以下方式选择投影矩阵堆栈:

视口的设置是正确的,你也可以正确地考虑纵横比(在<代码> GrutoX2D)。但是,如果纵横比小于1.0,则存在一个问题。它应该是

ySpan/=aspectRatio

我建议在
显示
功能中设置视口和投影矩阵,并在
重塑
功能中设置通知标志。请注意,应尽可能少地更改视口和投影矩阵

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);
    }

    .....
}

为什么在重塑函数中调用
2d
?它应该包含将投影矩阵重置为恒等式的代码。。。改为在显示函数中调用
2d
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);
    }

    .....
}