IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenGL Discussion :

Jarre qui ne s'affiche pas à l'écran


Sujet :

OpenGL

  1. #1
    Membre habitué
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Points : 174
    Points
    174
    Par défaut Jarre qui ne s'affiche pas à l'écran
    Bonjour,

    l'execution de mon programme ne m'affiche pas le jarre à l'écran.
    J'ai regardé pour voir ou ça clochait mais je ne trouve pas.

    Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    #include <GL/glut.h>
    #include <stdlib.h>
    #include <math.h>
    #define PI 3.14159263
     
    GLfloat jarre_2d[]={0,0,
    		    3,0,
    		    4,2,
    		    4,5,
    		    3,7,
    		    1,9,
    		    1,11,
    		    3,13};
     
    void lathe(int nbr_vertices, GLfloat profile[], float angle, int nbr_sections) {
     
      int s, v;
      float theta1, theta2, x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4;
     
      for(s=0; s<nbr_sections; s++) {
     
        theta1 = (s*1.0)*angle/nbr_sections*PI/180;
        theta2 = (s+1.0)*angle/nbr_sections*PI/180;
     
        for(v=0; v<nbr_vertices-1; v++) {
          x1 = profile[v*2]*cos(theta1);
          y1 = profile[v*2+1];
          z1 = profile[v*2]*sin(theta1);
     
          x2 = profile[v*2+2]*cos(theta1);
          y2 = profile[v*2+3];
          z2 = profile[v*2+2]*sin(theta1);
     
          x3 = profile[v*2+2]*cos(theta2);
          y3 = profile[v*2+3];
          z3 = profile[v*2+2]*sin(theta2);
     
          x4 = profile[v*2]*cos(theta2);
          y4 = profile[v*2+1];
          z4 = profile[v*2]*sin(theta2);
     
          glBegin(GL_POLYGON);
          glVertex3f(x1,y1,z1);
          glVertex3f(x2,y2,z2);
          glVertex3f(x3,y3,z3);
          glVertex3f(x4,y4,z4);
          glEnd();
     
        }   
      }
    }
     
     
    void display(void)
    {
      glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_DOUBLE); // Clear the colour and depth buffer
     
      glLoadIdentity(); // Clear matrix stack
     
      // We set the camera in position 50,50,100 and we look at origo
      gluLookAt(50,50,100,0,0,0,0,1,0);
     
      glColor3f(0.6,0.2,1.0);
     
      // jarre
      glTranslatef(-8,2,20);
      glScalef(10,10,10);
      lathe(8, jarre_2d, 360.0, 16);
     
      glFlush(); // Makes sure that we output the model to the graphics card
      glutSwapBuffers();
    }
     
    // Called when a key is pressed
    void key(unsigned char k, int x, int y)
    {
      if( k == 'q' ) exit(0);
    }
     
    void reshape(int width,int height)
    {
      glViewport(0,0,width,height); // Reset The Current Viewport
     
      glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
      glLoadIdentity(); // Reset The Projection Matrix
     
      // Calculate The Aspect Ratio Of The Window
      gluPerspective(45.0f,(float)640/(float)480,0.1f,1000.0f);
      // Always keeps the same aspect as a 640 wide and 480 high window
     
      glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
      glLoadIdentity(); // Reset The Modelview Matrix
    }
     
    void init()
    {
      glClearColor(0,0,0,0);
      glClearDepth(1.0); // Enables Clearing Of The Depth Buffer
      glDepthFunc(GL_LESS); // The Type Of Depth Test To Do
      glEnable(GL_DEPTH_TEST); // Enables Depth Testing
      glShadeModel(GL_SMOOTH); // Enables Smooth Color Shading
    }
     
    int main(int argc, char *argv[])
    {
      glutInit(&argc, argv);
      glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE); // We want rgb display functionality
      glutInitWindowSize(640,480); // Set the window dimensions
      glutInitWindowPosition(0,0); // Set the window starting point
      glutCreateWindow("Exercise 1"); // Set the caption and launch the window
     
      init();
     
      // Last things before rendering starts
      glutDisplayFunc(display); // This will be called every frame
      glutReshapeFunc(reshape); // Reshape the window when something changes
      glutKeyboardFunc(key); // Callback for input
     
      glutMainLoop(); // Starts the main program
     
      // We will not reach this point unless exit(0) is called (see function keyCB)
     
      return 0;
    }

  2. #2
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 125
    Points : 139
    Points
    139
    Par défaut
    Bon, je te fais confiance pour la boucle qui modélise un objet de révolution, ça m'a lair OK.
    Cependant, tu devrais calculer les normales (indispensables pour avoir un effet '3D'...). Pour cela, un peu de maths avec un produit vectoriel devrait faire l'affaire.

    Le fait que tu ne voies rien provient peut-être de l'absence de normales et vérifie aussi bien ton positionnement de caméra...

    Sinon, meme si ça n'a pas directement de lien avec ton problème, ça serait mieux de faire une display list pour ta jarre et de rejeter le glBegin() et le glEnd() en début et fin de lathe (pas besoin de les répéter à chaque boucle)

  3. #3
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 814
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 814
    Points : 7 642
    Points
    7 642
    Par défaut
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_DOUBLE); // Clear the colour and depth buffer

    C'est quoi ce GL_DOUBLE??? Ce n'est pas dans la liste des masques homologués pour glclear()... donc à virer! Ca marche beaucoup mieux après, si ce n'est tes choix de prise de vue qui font qu'on voit un gros paté violet...

    Ne vise pas le point (0,0,0) avec ta caméra, sachant que ton objet est placé en (-8,2,20).
    Ne place pas ta caméra en (50,50,100) sachant que tu as mis un scale de 10 sur un objet qui tient entre 0 et 10. Surtout si tu vises l'origine avec la caméra... Tu vas en voir que le quart...

    OK, il y avait une boulette dans le code, mais optimise quand même tes paramètres de prise de vue pour la prochaine fois...

    Et rajoute la remarque de Omfraax pour la 3D, là c'est pas bô...

  4. #4
    Membre habitué
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Points : 174
    Points
    174
    Par défaut
    Citation Envoyé par plegat
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_DOUBLE); // Clear the colour and depth buffer

    C'est quoi ce GL_DOUBLE??? Ce n'est pas dans la liste des masques homologués pour glclear()... donc à virer! Ca marche beaucoup mieux après, si ce n'est tes choix de prise de vue qui font qu'on voit un gros paté violet...

    Ne vise pas le point (0,0,0) avec ta caméra, sachant que ton objet est placé en (-8,2,20).
    Ne place pas ta caméra en (50,50,100) sachant que tu as mis un scale de 10 sur un objet qui tient entre 0 et 10. Surtout si tu vises l'origine avec la caméra... Tu vas en voir que le quart...

    OK, il y avait une boulette dans le code, mais optimise quand même tes paramètres de prise de vue pour la prochaine fois...

    Et rajoute la remarque de Omfraax pour la 3D, là c'est pas bô...
    J'ai fait quelques réglages,ajouté un cub et mis la possibilité de voir les objets en mode fil de fer parce que c'est vrai qu'en mode plein, c'est
    Le résultat


    Je voudrai pourvoir tourner mes objets.
    En faite, je ne comprends pas vraiment le systeme des glPushMatrix et des glPopMatrix. Je ne sais pas très bien à quel moment les utiliser.
    Si quelqu'un pouvait m'expliquer ?

    Merci

  5. #5
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 814
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 814
    Points : 7 642
    Points
    7 642
    Par défaut
    Citation Envoyé par Premium
    J'ai fait quelques réglages,ajouté un cub et mis la possibilité de voir les objets en mode fil de fer parce que c'est vrai qu'en mode plein, c'est
    Ah oui, beaucoup mieux qu'en mode plein!
    Un truc quu peut t'être utile, tant que tu es encore en train de tester, c'est de te tracer trois traits pour localiser l'origine et tes axes. Tu te fais trois tracés en GL_LINES, un en rouge entre les points (0,0,0) et (1,0,0) pour l'axe des x, un autre pour les y en vert entre (0,0,0) et (0,1,0), et un troisième en bleu pour les z entre (0,0,0) et (0,0,1). Ca te permettra de te repérer facilement. Si ta scène est relativement grande, tu fais varier la longueur de ces segments pour les voir

    Citation Envoyé par Premium
    Je voudrai pourvoir tourner mes objets.
    Là, ça va se compliquer...
    Il va falloir que tu récupères les évènements (clavier et/ou souris), et que tu gères la position et le déplacement de la caméra, et la position du point de visée.
    Pour un exemple, voir la leçon 48 chez Nehe

    Citation Envoyé par Premium
    En faite, je ne comprends pas vraiment le systeme des glPushMatrix et des glPopMatrix. Je ne sais pas très bien à quel moment les utiliser.
    Hyper simple.
    glPushMatrix te permet de stocker la matrice en mémoire. glPopMatrix te permet de la récupérer (c'est le même principe que le Push et le Pop en assembleur).
    Très utile quand tu fais des tas de manipulation à coups de translate et de rotate pour tracer une figure, qu'à la fin tu ne sais plus trop où tu es, et que tu veux revenir au même endroit que là où tu étais avant de commencer. Avant de faire tes manip, tu lances un glPushMatrix, tu fais tes manips, et au final tu lance un glPopMatrix et tu te retrouves au même endroit que quand tu as lancé le glPushMatrix.
    Pour illustrer, tu es chez toi, dans ton lit, tu fais un glPushMatrix, tu vas ensuite faire un tour en ville, tu rencontres trois potes, vous vous racontez votre semaine, vous allez boire une bière, puis deux, puis trois, puis... à la fin t'es trop bourré, tu sais même plus où tu habites... hop! Un petit coup de glPopMatrix, et tu te retrouves dans ton lit! Mais tu es toujours bourré...
    C'est bon là?

  6. #6
    Membre habitué
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Points : 174
    Points
    174
    Par défaut
    Citation Envoyé par plegat
    Hyper simple.
    glPushMatrix te permet de stocker la matrice en mémoire. glPopMatrix te permet de la récupérer (c'est le même principe que le Push et le Pop en assembleur).
    Très utile quand tu fais des tas de manipulation à coups de translate et de rotate pour tracer une figure, qu'à la fin tu ne sais plus trop où tu es, et que tu veux revenir au même endroit que là où tu étais avant de commencer. Avant de faire tes manip, tu lances un glPushMatrix, tu fais tes manips, et au final tu lance un glPopMatrix et tu te retrouves au même endroit que quand tu as lancé le glPushMatrix.
    Pour illustrer, tu es chez toi, dans ton lit, tu fais un glPushMatrix, tu vas ensuite faire un tour en ville, tu rencontres trois potes, vous vous racontez votre semaine, vous allez boire une bière, puis deux, puis trois, puis... à la fin t'es trop bourré, tu sais même plus où tu habites... hop! Un petit coup de glPopMatrix, et tu te retrouves dans ton lit! Mais tu es toujours bourré...
    C'est bon là?
    On fait un push et un pop entre chaque crétion d'objet mais pour pouvoir faire tourner tous les objets d'une scene en même temps, les push et les pop doivent être mis ou ?
    Autre question : le push ne prend en compte que ce qu'il y a en dessous ?

  7. #7
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 814
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 814
    Points : 7 642
    Points
    7 642
    Par défaut
    Citation Envoyé par Premium
    On fait un push et un pop entre chaque crétion d'objet mais pour pouvoir faire tourner tous les objets d'une scene en même temps, les push et les pop doivent être mis ou ?
    Là où tu en as besoin.
    Ca dépend de ta programmation, de ta méthode, de ton algorithme.
    J'ai une application qui utilise OpenGL, je n'ai pas un seul glPushMatrix dedans. Pas eu besoin de m'en servir.
    C'est un outil, ce n'est pas une obligation de s'en servir. Tu t'en sers si tu en as besoin.


    Citation Envoyé par Premium
    Autre question : le push ne prend en compte que ce qu'il y a en dessous ?
    en dessous???
    en dessous de quoi?

  8. #8
    Membre habitué
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Points : 174
    Points
    174
    Par défaut
    Citation Envoyé par plegat
    Là où tu en as besoin.
    en dessous???
    en dessous de quoi?
    Par exemple dans ce code, le 1er glPushMatrix contient quoi ?
    El les autres qui sont utilisés ensuite ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
     void display(void)
    {
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); // Clear the colour and depth buffer
     
    glLoadIdentity(); // Clear matrix stack
     
    // We set the camera in position 50,50,100 and we look at origo
    gluLookAt(50,50,100,0,0,0,0,1,0);
     
    // Make the model rotate around the y axis.
    glRotatef(rot_val,0,1,0);
     
    glColor3f(1,0,0);
    glBegin(GL_LINES);
    glColor3f(1,0,0);
    glVertex3f(0,0,0);
    glVertex3f(1000,0,0);
    glEnd();
     
    glColor3f(0,1,0);
    glBegin(GL_LINES);
    glVertex3f(0,0,0);
    glVertex3f(0,1000,0);
    glEnd();
     
    glColor3f(0,0,1);
    glBegin(GL_LINES);
    glVertex3f(0,0,0);
    glVertex3f(0,0,1000);
    glEnd();
     
     
    glPushMatrix();
    glTranslatef(-10,0,-10);
     
    // T base
    // Draw cube 1
    glPushMatrix();
    glTranslatef(0,5,25);
    glScalef(5,5,50);
    drawCube();
    glPopMatrix();
     
    // T roof
    // Draw cube 2
    glPushMatrix();
    glTranslatef(0,5,0);
    glScalef(30,5,5);
    drawCube();
    glPopMatrix();
     
    // P base
     
    glPushMatrix();
    glTranslatef(30,5,25);
    glScalef(5,5,50);
    drawCube();
    glPopMatrix();
     
    glPushMatrix();
    glTranslatef(40,5,0);
    glScalef(25,5,5);
    drawCube();
    glPopMatrix();
     
    glPushMatrix();
    glTranslatef(40,5,25);
    glScalef(25,5,5);
    drawCube();
    glPopMatrix();
     
    glPushMatrix();
    glTranslatef(50,5,13);
    glScalef(5,5,25);
    drawCube();
    glPopMatrix();
     
    glPopMatrix();
     
    // Draw plane
    glPushMatrix();
    glScalef(100,100,100);
    drawPlane();
    glPopMatrix();
     
     
    glFlush(); // Makes sure that we output the model to the graphics card
    glutSwapBuffers();
    glutPostRedisplay();
    }

  9. #9
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 814
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 814
    Points : 7 642
    Points
    7 642
    Par défaut
    Citation Envoyé par Premium
    Par exemple dans ce code, le 1er glPushMatrix contient quoi ?
    Il ne contient rien.
    Il dit juste à OpenGl de mettre la matrice courante (GL_MODELVIEW en l'occurence) en mémoire.
    C'est une instruction qui visuellement ne fais rien. Elle ne fait que mémoriser la matrice. Mettre en mémoire. Enregistrer. Rien d'autre.

    Citation Envoyé par Premium
    El les autres qui sont utilisés ensuite ?
    La même chose.

    Le seul truc, c'est que tu ne peux appeler glPopMatrix que si tu as fait un glPushMatrix avant.
    Ca marche avec un pile (pas une pile de 1.5V... un empilement si tu préfères). Donc si tu veux récupérer une matrice, il faut l'avoir enregistrer avant. Sinon il n'y a rien à récupérer. Dans le code que tu mets, on veut pouvoir revenir à une certaine position 7 fois. Il faut donc sauvegarder la matrice 7 fois, même si on ne se déplace pas. Je fais un glPush pour plus tard pouvoir faire un glPop. Si je n'ai pas fait de glPush, je ne peux pas faire un glPop. C'est le principe de la pile (pas la pile électrique... la pile de matrices...). La pile LIFO pour être précis (Last In-First Out, voir Google ou Wikipedia pour plus d'infos).

Discussions similaires

  1. Fond d'écran qui ne s'affiche pas
    Par lia dans le forum Debian
    Réponses: 0
    Dernier message: 07/01/2009, 17h33
  2. pages qui ne s'affichent pas
    Par luck dans le forum ASP
    Réponses: 4
    Dernier message: 19/07/2004, 11h35
  3. [Applet] BorderLayout qui ne s'affiche pas
    Par Invité(e) dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 29/04/2004, 11h39
  4. [debutant][Tomcat]Images qui ne s'affichent pas
    Par omega dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 07/04/2004, 09h44
  5. [MFC] Ces fenêtres qui ne s'affichent pas..
    Par Davide dans le forum MFC
    Réponses: 3
    Dernier message: 19/11/2003, 11h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo