动态更改 gluPerspective() 的参数?

Change parameters of gluPerspective() dynamically?

为了理解gluPerspective()是如何工作的,我想用键盘的箭头动态地改变它的参数(第一个是角度)。

如何让它工作,在回调函数中设置矩阵模式时是否有问题?

这是我目前的代码,但按下左箭头或右箭头时没有任何反应:

double angle = 45;

void renderScene(void) {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glClearColor(0, 1, 1, 1);

    glBegin(GL_TRIANGLES);
    glVertex3f(-2, -2, -5.0);
    glVertex3f(2, 0.0, -5.0);
    glVertex3f(0.0, 2, -5.0);
    glEnd();

    glutSwapBuffers();
}

void keyboard(int c, int x, int y) {

    switch (c) {
    case GLUT_KEY_LEFT:
        angle -= 15;
        break;

    case GLUT_KEY_RIGHT:
        angle += 15;
        break;
    }
}

void changeSize(int w, int h) {

    // Prevent a divide by zero, when window is too short
    // (you cant make a window of zero width).
    if (h == 0)
        h = 1;
    float ratio = 1.0* w / h;

    // Use the Projection Matrix
    glMatrixMode(GL_PROJECTION);

    // Reset Matrix
    glLoadIdentity();

    // Set the viewport to be the entire window
    glViewport(0, 0, w, h);

    // Set the correct perspective.
    gluPerspective(angle, ratio, 1, 1000);

    // Get Back to the Modelview
    glMatrixMode(GL_MODELVIEW);
}

int main(int argc, char **argv) {
    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
    glutInitWindowPosition(200, 300);//optional
    glutInitWindowSize(800, 600); //optional
    glutCreateWindow("OpenGL First Window");
    glutDisplayFunc(renderScene);

    glutSpecialFunc(keyboard);
    glutReshapeFunc(changeSize);

    glutMainLoop();

    return 0;
}

传递给 glutReshapeFunc 的函数仅在 window 调整大小时调用。因此 gluPerspective 的新参数仅在此之后使用。例如,您可以在调整角度后手动调用该函数:

void keyboard(int c, int x, int y) {

    switch (c) {
    case GLUT_KEY_LEFT:
        angle -= 15;
        break;

    case GLUT_KEY_RIGHT:
        angle += 15;
        break;
    }

    changeSize(glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT));
}

您还没有通知显示回调函数更新您的新角度。
在键盘函数的最后调用函数 glutPostRedisplay() 以查看更新后的角度。