为什么我不能立即放大和缩小效果,但必须先调整窗口大小

时间:2015-07-15 20:57:48

标签: c++ opengl

我是OpenGL的新手。我遇到了一个问题。为什么我不能立即在OpenGL中放大和缩小效果,但必须首先调整窗口大小,然后我才能看到绘制的图像变小或变大。

我很抱歉,我不应该提供哪一部分程序来澄清这个问题。

我认为问题可能是由鼠标功能引起的?

void glutMouseWheel(int wheel_number, int direction, int x, int y)
{
if (direction == 1)
    zoomFactor = 0.5*zoomFactor;
 else
     zoomFactor = 2* zoomFactor;
     glutPostRedisplay();
}



void reshape(int w, int h)
{

glViewport(0, 0, (GLsizei)w, (GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-0.001*zoomFactor, 0.001*zoomFactor, -0.001*zoomFactor, 0.001*zoomFactor, -100, 100);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
 }

如您所见,我定义了一个双zoomFactor来调整正交音量以缩放图像。它应该没问题,但我不知道为什么我仍然遇到这个问题。

1 个答案:

答案 0 :(得分:3)

现在您可以更改zoomFactor您想要的所有内容,但它不会应用于OpenGL状态(通过resize()中的代码),直到您调整窗口大小。

glutPostRedisplay() 末尾的glutMouseWheel()不会 导致glutReshapeFunc()回调运行。它只安排glutDisplayFunc()电话。

将除glViewport()来电之外的所有内容从reshape()移至您的glutDisplayFunc()回调:

void reshape(int w, int h)
{
    glViewport(0, 0, (GLsizei)w, (GLsizei)h);
}

void display()
{
    // clear framebuffer
    ...

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-0.001*zoomFactor, 0.001*zoomFactor, -0.001*zoomFactor, 0.001*zoomFactor, -100, 100);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    // draw stuff
    ...

    glutSwapBuffers();
}