Bonjour,
je code un mini jeu vidéo 3D à l'aide de Glut et OpenGL. Je fais se déplacer la caméra dans une pièce rectangulaire contenant des objets type sphères cubes etc... Jusqu'ici rien de bien compliqué. J'ai commencé par faire un rendu en Fil de Fer de mes formes, et tout marche très bien. J'utilisais par exemple la fonction glutWireSphere() pour faire une sphère. Maintenant je souhaite voir ce que cela donne en solide (glutSolidSphere()) mais je me confronte à des problèmes d'éclairage. Je souhaite juste avoir un éclairage très simple, ne dépendant pas de la position de la camera et me permettant de voir tous les objets (dans la couleur qu'ils ont) dans mon angle de vision.
J'ai pour cela décidé de placer les commandes d'éclairage avant mes commandes de visualisation (glTranslated et glRotated) qui me permettent de faire bouger la camera. Ainsi j'espérais avoir un éclairage qui s'applique après que tout ait été calculé. Mais il reste des zones d'ombres, et tous les objets apparaissent blancs (couleur que j'ai donné a la lumière) alors qu'ils ont une couleur. J'ai donc mis 4 lumières à des positions proches de l'origine de la camera, mais rien n'y fait. De plus j'ai l'impression de voir à l'intérieur des cubes... Quelqu'un peut il m'aider ?
Voici le code de ma fonction d'affichage :
Voici le code de ma fonction d'initialisation (juste les commandes pour la lumière) :
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 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glScaled((double)screen_y/(double)screen_x,1,1); /* Eclairage */ GLfloat L0pos[]={0.,mHauteur/2.,-0.3}; GLfloat L1pos[]={0.,mHauteur/2.-0.1,-0.3}; GLfloat L2pos[]={0.,mHauteur/2.+0.1,-0.3}; GLfloat L3pos[]={0.,mHauteur/2.,0.}; glLightfv(GL_LIGHT0,GL_POSITION,L0pos); glLightfv(GL_LIGHT1,GL_POSITION,L1pos); glLightfv(GL_LIGHT2,GL_POSITION,L2pos); glLightfv(GL_LIGHT3,GL_POSITION,L3pos); /*Application des transfos de visualisation */ glRotated((*pPointDeVue)->Phi(),0.0,1.0,0.0); glRotated((*pPointDeVue)->Theta()-90,(*pPointDeVue)->CosAngle(),0.0,(*pPointDeVue)->SinAngle()); glTranslatef(-(*pPointDeVue)->X(),-(*pPointDeVue)->Y(),-(*pPointDeVue)->Z()); glPushMatrix(); /* Dessin de la piece */ glColor3d(mCouleur.GetR(),mCouleur.GetV(),mCouleur.GetB()); glTranslated(0,mHauteur/2.,0); glScaled(mLargeur,mHauteur,mLongueur); glutSolidCube(1); /*AFFICHAGE DE TOUTES MES FORMES*/ glFlush(); glutSwapBuffers();
J'attache à mon post une image de mon rendu ...
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 /* initialisation de glut et creation de la fenetre */ glutInit(argc,argv); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); glutInitWindowPosition(200,200); glutInitWindowSize(screen_x,screen_y); glutCreateWindow("X"); /* Initialisation d'OpenGL */ glClearColor(0.0,0.0,0.0,0.0); glPointSize(1.0); /* Mise en place de la perspective */ glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(64.0,1.0,0.1,40.0); glMatrixMode(GL_MODELVIEW); GLfloat L0dif[]={0.7,0.7,0.7}; GLfloat Mspec[]={0.5,0.5,0.5}; GLfloat Mshiny=50; /* Paramétrage de la lumiere */ glShadeModel(GL_SMOOTH); glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER,GL_TRUE); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_LIGHT1); glEnable(GL_LIGHT2); glEnable(GL_LIGHT3); glLightfv(GL_LIGHT0,GL_DIFFUSE,L0dif); glLightfv(GL_LIGHT0,GL_SPECULAR,L0dif); glLightfv(GL_LIGHT1,GL_DIFFUSE,L0dif); glLightfv(GL_LIGHT1,GL_SPECULAR,L0dif); glLightfv(GL_LIGHT2,GL_DIFFUSE,L0dif); glLightfv(GL_LIGHT2,GL_SPECULAR,L0dif); glLightfv(GL_LIGHT3,GL_DIFFUSE,L0dif); glLightfv(GL_LIGHT3,GL_SPECULAR,L0dif); /* Paramétrage du matériau */ glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,Mspec); glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,Mshiny);
Merci beaucoup !
Partager