2010-10-30 5 views
2

Je suis en train de lire l'exemple de code de la courbe de Bézier dans la version en ligne du didacticiel d'opengl.Comprendre le redimensionnement d'opengl (glut)

Je suis curieux de savoir comment est resize être manipulé dans l'exemple parce que je me dis que je pourrais l'utiliser sur ma propre version de ce programme, j'ai placé mes questions sur ses commentaires:

void reshape(int w, int h) 

{ 
    glViewport(0, 0, (GLsizei) w, (GLsizei) h); // what's GLsizei? Why is it called inside glViewPort? 
    glMatrixMode(GL_PROJECTION); // is it necessary to reset the projection matrix? 
    glLoadIdentity(); 
    if (w <= h) // is this calculation universal, could I use it on another program? 
     glOrtho(-5.0, 5.0, -5.0*(GLfloat)h/(GLfloat)w, 
       5.0*(GLfloat)h/(GLfloat)w, -5.0, 5.0); 

    else 
     glOrtho(-5.0*(GLfloat)w/(GLfloat)h, 
       5.0*(GLfloat)w/(GLfloat)h, -5.0, 5.0, -5.0, 5.0); 
    glMatrixMode(GL_MODELVIEW); // why do I set to GL_MODELVIEW at the end? 
    glLoadIdentity(); // why does it get a reset? 
} 

code complet:

#include <stdlib.h> 
#include <GL/glut.h> 

GLfloat ctrlpoints[4][3] = { 
    { -4.0, -4.0, 0.0}, { -2.0, 4.0, 0.0}, 
    {2.0, -4.0, 0.0}, {4.0, 4.0, 0.0}}; 


void init(void) 
{ 
    glClearColor(0.0, 0.0, 0.0, 0.0); 
    glShadeModel(GL_FLAT); 
    glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, &ctrlpoints[0][0]); 
    glEnable(GL_MAP1_VERTEX_3); 
} 

void display(void) 

{ 
    int i; 

    glClear(GL_COLOR_BUFFER_BIT); 
    glColor3f(1.0, 1.0, 1.0); 
    glBegin(GL_LINE_STRIP); 
     for (i = 0; i <= 30; i++) 
     glEvalCoord1f((GLfloat) i/30.0); 
    glEnd(); 
    /* The following code displays the control points as dots. */ 

    glPointSize(5.0); 
    glColor3f(1.0, 1.0, 0.0); 
    glBegin(GL_POINTS); 
     for (i = 0; i < 4; i++) 
     glVertex3fv(&ctrlpoints[i][0]); 
    glEnd(); 
    glFlush(); 

} 

void reshape(int w, int h) 

{ 
    glViewport(0, 0, (GLsizei) w, (GLsizei) h); // what's GLsizei? Why is it called inside glViewPort? 
    glMatrixMode(GL_PROJECTION); // is it necessary to reset the projection matrix? 
    glLoadIdentity(); 
    if (w <= h) // is this calculation universal, could I use it on another program? 
     glOrtho(-5.0, 5.0, -5.0*(GLfloat)h/(GLfloat)w, 
       5.0*(GLfloat)h/(GLfloat)w, -5.0, 5.0); 

    else 
     glOrtho(-5.0*(GLfloat)w/(GLfloat)h, 
       5.0*(GLfloat)w/(GLfloat)h, -5.0, 5.0, -5.0, 5.0); 
    glMatrixMode(GL_MODELVIEW); // why do I set to GL_MODELVIEW at the end? 
    glLoadIdentity(); // why does it get a reset? 
} 

void keyboard(unsigned char key, int x, int y) 

{ 
    switch (key) { 
     case 27: 
     exit(0); 
     break; 
    } 
} 

int main(int argc, char** argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); 

    glutInitWindowSize (500, 500); 
    glutInitWindowPosition (100, 100); 
    glutCreateWindow (argv[0]); 
    init(); 
    glutDisplayFunc(display); 
    glutReshapeFunc(reshape); // el reshape funciona correctamente 
    glutKeyboardFunc (keyboard); 

    glutMainLoop(); 
    return 0; 
} 

Répondre

4

GLsizei est un type , pas une fonction. Par conséquent, ce n'est pas appelé; étant coulé; Il convertit un int en un GLsizei. Il s'agit essentiellement d'un int, mais il est clair que vous l'utilisez pour une taille (je pense). (Je suis un programmeur Python, c'est une supposition)

glMatrixMode(...); 

Cela ne pas remis à zéro la matrice, sauf si elle est suivie d'un appel glLoadIdentity(). Au lieu de cela, il définit la cible actuelle des opérations de matrice OpenGL sur la matrice spécifiée. De cette façon, OpenGL sait quelle matrice vous voulez affecter.

J'ai vu cette calcuation auparavant dans l'OpenGL superbible (ou au moins quelque chose comme ça); pourquoi ne parlez-vous pas à travers cela et voyez ce que c'est de décider et pourquoi? (Indice (je pense): il essaie de garder la fenêtre de vue carrée pour éviter l'étirement)

À la fin, il revient à GL_MODELVIEW car cette matrice gère les transformations, comme la translation et la rotation, qui sont utilisées pour positionner les sommets à l'écran. . Il devrait être réinitialisé à chaque image de sorte que votre code puisse supposer que le plan de coordonnées est actuellement à (0,0); cela simplifie les calculs sur l'endroit où traduire.

Notez également que reshape n'est pas appelé par OpenGL, mais par GLUT. OpenGL est indépendant de la plate-forme et ne gère pas les fenêtres; C'est pourquoi vous avez besoin de GLUT.

Si vous êtes un nouvel utilisateur d'OpenGL, vous devriez le travailler dès le début - les tutoriels ultérieurs supposeront ce type de connaissances.

+0

+1 Bien que vous soyez un programmeur python, vous avez tout correct :) –

+0

La question ne dit pas que glMatrixMode (GL_PROJECTION) réinitialise la matrice:/ – andandandand

+0

Je vais changer le titre de la question, je sais (et je savais) ceci est passé à un rappel de surabondance. – andandandand