Para entender cómo funciona gluPerspective(), me gustaría cambiar sus parámetros (el primero que es el ángulo) dinámicamente con las flechas del teclado.

¿Cómo puedo hacer que funcione? ¿Es un problema cuando el modo de matriz está configurado en una función de devolución de llamada?

Aquí está el código que tengo hasta ahora, pero no sucede nada cuando se presiona la flecha izquierda o derecha:

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;
}
0
yooo123 12 nov. 2017 a las 19:01

2 respuestas

La mejor respuesta

La función pasada a glutReshapeFunc solo se llama cuando la ventana cambia de tamaño. Por lo tanto, los nuevos parámetros para gluPerspective solo se usan después de eso. Puede, por ejemplo, llamar a la función manualmente después de haber ajustado el ángulo:

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));
}
0
BDL 12 nov. 2017 a las 16:08

No ha informado a la función de devolución de llamada de la pantalla para actualizar su nuevo ángulo.
Llame a la función glutPostRedisplay() en la última función del teclado para ver el ángulo actualizado.

0
Tiw 7 mar. 2019 a las 15:53