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);
}