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 :

problème Illumination opengl


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2
    Par défaut problème Illumination opengl
    Bonjour,
    je réalise un programme opengl simple avec des lumières : une scène qui contient une seule lumière positionnelle jaune, une lumière ambiante faible et un seul objet. Ce dernier est soit un cube, soit une sphère soit une theière (selon que l'utilisateur appuie sur la touche 'c', 's' ou 't'). Or si l'illumination fonctionne bien dans le cas de la sphère (on s'en rend bien compte lorsque qu'on appuie sur 'x' 'y' ou 'z' et que le point de vue effectue les rotations correspondant aux axes x, y et z) elle ne se fait pas dans le cas de la theiere et du cube. Pourtant le propriétés de matériaux et les normales sont positionnées... j'avoue que je commence à désespérer car ça fait un moment que je bloque sur ça, de l'aide serait vraiment la bienvenue.
    Merci de votre attention.
    Ne sachant pas d'où vient précisemment le problème je met mon code en entier...
    (NB: j'ai modélisé la position de la lampe avec une sphère filaire)

    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
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    #include <GL/glut.h>
    #include <iostream>
     
    // Constantes
    #define WINDOW_SIZE 800
     
    static float    bleu [] = { 0.0, 0.0, 1.0, 1.0 };
    static float   rouge [] = { 1.0, 0.0, 0.0, 1.0 };
    static float    vert [] = { 0.0, 1.0, 0.0, 1.0 };
     
    static float   jaune [] = { 1.0, 1.0, 0.0, 1.0 };
    static float    cyan [] = { 0.0, 1.0, 1.0, 1.0 };
    static float magenta [] = { 1.0, 0.0, 1.0, 1.0 };
     
    static float    noir [] = { 0.0, 0.0, 0.0, 1.0 };
    static float   blanc [] = { 1.0, 1.0, 1.0, 1.0 };
    static float    gris [] = { 0.5, 0.5, 0.5, 1.0 };
    int objet = 0; // 0=on affiche le cube, 1= la sphere et 2= la theiere
    int zoom = 10;
    int rotationX=0;
    int rotationY=0;
    int rotationZ=0;
    GLfloat position[4]= {0.0,0.0,zoom/2.0,1.0}; //position lumière positionnelle
     
    void dessineTheiere() {
     
      glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, blanc);
      glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, blanc);
      glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, blanc);
      glutSolidTeapot(1.0);
    }
     
    void dessineSphere() {
      glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, blanc);
      glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, blanc);
      glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, blanc);
      glutSolidSphere(1.0,10,10);
    }
     
    // Dessin d'un cube simple
    void dessineCube()
    {
      glBegin(GL_QUADS);
      glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, blanc);
      glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, blanc);
      glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, blanc);
      glNormal3i(0,0,1);
      glVertex3f(-1,1,1);
      glVertex3f(-1,-1,1);
      glVertex3f(1,-1,1);
      glVertex3f(1,1,1);   //1 face
      glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT,jaune);
      glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE,jaune );
      glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR,jaune );
      glNormal3i(0,0,-1);
      glVertex3f(1,1,-1);
      glVertex3f(1,-1,-1);
      glVertex3f(-1,-1,-1);
      glVertex3f(-1,1,-1);	//2 faces
      glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, vert);
      glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE,vert );
      glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR,vert );
      glNormal3i(1,0,0);
      glVertex3f(1,1,1);
      glVertex3f(1,-1,1);
      glVertex3f(1,-1,-1);
      glVertex3f(1,1,-1);	//3 faces
      glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, rouge);
      glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, rouge);
      glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR,rouge);
      glNormal3i(-1,0,0);
      glVertex3f(-1,1,-1);
      glVertex3f(-1,-1,-1);
      glVertex3f(-1,-1,1);
      glVertex3f(-1,1,1);  //4 faces
      glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, magenta);
      glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, magenta);
      glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR,magenta);
      glNormal3i(0,1,0);
      glVertex3f(-1,1,-1);
      glVertex3f(-1,1,1);
      glVertex3f(1,1,1);
      glVertex3f(1,1,-1);	//5 faces
      glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, cyan);
      glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, cyan);
      glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR,cyan);
      glVertex3f(1,-1,-1);
      glVertex3f(1,-1,1);
      glVertex3f(-1,-1,1);
      glVertex3f(-1,-1,-1);//6 faces
      glEnd();
    }
     
    // Fonction d'affichage
    void display()
    {
     
      glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
      // Dessin du carré en appliquant différentes transformations
      glPushMatrix();
      glEnable(GL_LIGHT0);
      glLightfv(GL_LIGHT0, GL_DIFFUSE, jaune);
      glLightfv(GL_LIGHT0, GL_AMBIENT, noir);
      glLightfv(GL_LIGHT0, GL_SPECULAR, jaune);
      glLightModelfv(GL_LIGHT_MODEL_AMBIENT, gris);
      glTranslatef(0,0,-zoom);
      glRotatef(rotationX,1,0,0);
      glRotatef(rotationY,0,1,0);
      glRotatef(rotationZ,0,0,1);
      glLightfv(GL_LIGHT0, GL_POSITION, position);
      //situer la source lumineuse positionnelle à l'aide d'une sphere filaire
      glPushMatrix();
      glTranslatef(position[0],position[1],position[2]);
      glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, blanc);
      glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, blanc);
      glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, blanc);
      glutWireSphere(0.10,10,10); // pour modéliser la source lumineuse
      glPopMatrix();
      if (objet==0) {dessineCube();}
      if (objet == 1) {dessineSphere();}
      if (objet == 2) {dessineTheiere();}
      glPopMatrix();
      glFlush();
      glutSwapBuffers() ;
    }
     
    // Fonction de controle du clavier
    void key(unsigned char key,int x,int y)
    {
      switch(key)
        {
          // Arrêt du prog. si on appuie sur 'Q' ou 'q'
        case 'Q':
        case 'q':
          exit(0);
     
        case 'x':
          rotationX+=5;
          break;
        case 'X':
          rotationX-=5;
          break;
     
        case 'y':
          rotationY+=5;
          break;
        case 'Y':
          rotationY-=5;
          break;
     
        case 'z':
          rotationZ+=5;
          break;
        case 'Z':
          rotationZ-=5;
          break;
        case 'c':
          objet=0;
          break;
        case 's':
          objet=1;
          break;
        case 't':
          objet=2;
          break;
        case '-':
          zoom++;
          break;
        case '+':
          zoom--;
          break;
     
     
        }
      glutPostRedisplay();
    }
     
    //Fonction de gestion des événements souris
    void mouseEvent( int button, int state, int x, int y )
      // -----------------------------------------------------
      // button:
      //   GLUT_LEFT_BUTTON
      //   GLUT_RIGHT_BUTTON
      //   GLUT_MIDDLE_BUTTON
      //
      // state:
      //   GLUT_UP
      //   GLUT_DOWN
    {
     
      if( state == GLUT_DOWN && button == GLUT_LEFT_BUTTON )
        printf("Clic à la position (%4i,%4i).\n", x, y );
     
    }
     
    int main(int argc, char* argv)
    {
      glutInit(&argc,&argv);
     
      // Initialisation de la fenêtre OpenGL
      glutInitDisplayMode(GLUT_RGBA|GLUT_DEPTH|GLUT_DOUBLE);
      glutInitWindowSize(WINDOW_SIZE,WINDOW_SIZE);
      glutInitWindowPosition(50,10);
      glutCreateWindow("Illumination simple");
      glEnable(GL_DEPTH_TEST);
     
      glEnable(GL_SMOOTH);
      glEnable(GL_LIGHTING);
      // Définition de la fonction de gestion du clavier
      glutKeyboardFunc(key);
      // Définition de la fonction d'affichage
      glutDisplayFunc(display);
      // Définition de la fonction de gestion de la souris
      glutMouseFunc(mouseEvent);
     
      // Définition de la couleur de fond (RGBT)
      glClearColor(0.8F,0.8F,0.8F,1.0F);
     
      // Définition de la zone de vue
      glViewport(0,0,WINDOW_SIZE,WINDOW_SIZE);
     
      // Projection en perspective
      gluPerspective(30.0, 1.0, 0.001, 100.0);
     
      // Lancement de la boucle d'affichage
      glutMainLoop();
      return(0);
    }

  2. #2
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2
    Par défaut
    j'ai résolu mon problème, il venait de deux choses différentes en fait :

    illumination du cube : le fait de spécifier le normales par glNoraml3i au lieu de glNormal3f alors que le cube est dessiné en glVertex3f.

    illumination de la theière : le fait de ne pas spécifier explicitement les opérations de projections ou modelview.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème caméra OpenGL/C++
    Par jockyboss777 dans le forum OpenGL
    Réponses: 6
    Dernier message: 17/03/2009, 11h48
  2. Problême avec OpenGL
    Par choko83 dans le forum OpenGL
    Réponses: 16
    Dernier message: 03/04/2008, 13h49
  3. Probléme avec OpenGL
    Par amine_star dans le forum Bibliothèques
    Réponses: 1
    Dernier message: 07/04/2007, 13h40
  4. [OpenGL/C++] Problème Device Opengl
    Par Bob.Killer dans le forum OpenGL
    Réponses: 3
    Dernier message: 27/09/2005, 11h04

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