UJF - M2 IICAO 2005-2006 : Infographie
TP3 : Illumination et modèle d'éclairage
pdf et main.cpp
Aujourd'hui nous allons étudier l'utilisation des lumières en openGL
ainsi que l'effet des différents paramètres d'illumination utilisables.
Récupérez le nouveau fichier main.cpp, y sont définies
deux nouvelles procédures :
- initLights : initialise une lumière openGL en définissant
sa position et ses particularités d'éclairage : une partie de la lumière
est diffuse, une autre partie est spéculaire. Cette lumière est de
type solaire, c'est-à-dire que tous les rayons sont parallèles et
que la position définit en fait l'angle d'attaque de la lumière dans
l'espace.
- dessinerSphere : dessine une sphère (grâce à la
procédure glutSolidSphere de la librairie GLUT). Dans cette procédure
sont définis les propriétés globales de la sphère : sa composante
diffuse (ici verte), sa composante spéculaire (ici nulle) et sa brillance
(shininess) ainsi qu'une couleur ambiante (ici nulle).
NB : la dernière composante des couleurs (car ce sont des vecteurs
à 4 réels) est toujours 1, elle représente l'opacité (nous ne verrons
pas cette notion aujourd'hui).
- Compilez le programme et exécutez le avec le paramètre ''-t 6''
pour afficher la sphère.
- Tournez autours de la sphère. Rajoutez les paramètres ''-c 100 -l
100'' pour obtenir plus de triangles sur la sphère. Qu'observez vous
et pourquoi ?
- Changez la couleur de la lumière (dans initLights)
en ''{1,0,1,1}''. Qu'observez vous et pourquoi ?
- Revenez à la couleur précédente pour la lumière et donnez pour composante
spéculaire du matériau le rouge : ''{1,0,0,1} . Qu'observez vous
et pourquoi ?
- Donnez pour composante spéculaire du matériau le blanc. Prennez moins
de point pour la sphère (''-c 10 -l 10''). Toujours avec un paramètre
de brillance de 100, pourquoi la ''tache'' disparait-elle selon
le point de vue ?
Pour plus de détails sur l'éclairage en openGL, vous pouvez vous référer
à un tutoriel (par exemple http://www-evasion.imag.fr/Membres/Antoine.Bouthors/teaching/opengl/opengl5.html).
- Ajoutez une ou plusieurs autres lumières (changez leur position) et
analysez l'effet de différents paramètres d'illumination des lumières
et de la sphère (après les avoir déclarées dans initLights,
ajoutez les, de la même manière que la première, dans la procédure
moveLight à la fin du fichier main.cpp).
Nous travaillerons maintenant avec le maillage indexé sinus
animé.
Comme vous l'avez vu en cours, pour pouvoir évaluer la couleur en
un point de la surface, vous devez connaître la normale de la surface
en ce point.
- Intégrez les normales dans le MaillageIndexe.
- Ecrivez les fonctions nécessaires au calcul des normales d'un maillage.
- Quand est-il nécessaire de recalculer les normales d'un maillage ?
- Pour vérifier si vos normales sont correctes :
- Désactivez la lumière en commentant l'appel de procédure initLights
dans le main.
- Visualisez la normale en chaque point en dessinant un vecteur à partir
de chaque vertex. Pour dessiner un trait (une ligne) entre 2 points,
il vous suffit d'utiliser le mode de rendu openGL correspondant (si
vous rajoutez des vertex, openGL tracera une nouvelle ligne en partant
du dernier point !) :
-
- glBegin(GL_LINES);
glVertex3f(p1.x,p1.y,p1.z);
glVertex3f(p2.x,p2.y,p2.z);
glEnd();
- Réactivez l'éclairage
Connaissant la normale en chaque sommet du maillage vous pouvez dorénavant
utiliser la procédure glNormal3f avant chaque glVertex3f
pour leur associer une normale.
- Visualisez le maillage. Il a perdu toute couleur ! En effet, le fait
d'activer l'éclairage fait qu'openGL ignore maintenant les couleurs
données par glColor3f et ne se fie qu'au matériau
de l'objet.
- Pour donner un matériau global au maillage, il suffit d'appeler les
procédures openGL glMaterialfv juste avant de dessiner
le maillage (comme pour la sphère). Essayez différents paramètres
(spécularité, diffusion).
- Il est bien sûr possible d'affecter un matériau spécifique à chaque
sommet du maillage de deux manières différentes :
- En conservant les glColor3f : il suffit d'activer
le paramètre GL_COLOR_MATERIAL d'openGL (décommentez
la ligne intéressée dans la procédure initLights).
Maintenant (et par défaut), chaque appel de glColor3f
va modifier la composante spéculaire du vertex intéressé, vous devriez
donc maintenant retrouver un résultat similaire au TP précédent, avec
l'aspect diffus en plus
- (désactivez GL_COLOR_MATERIAL) En appliquant un
matériau différent pour chaque vertex en utilisant des glMaterialfv
avant chaque vertex. Redonnez une couleur diffuse uniforme blanche
pour tout le maillage et affectez comme couleur spéculaire pour chaque
vertex, la couleur stockée dans la structure ''Couleur'' du maillage.
Dans le fichier main.cpp, regardez la procédure
moveLight et décommentez l'évolution de x
et y en fonction du temps. Essayez de changer vous
même les paramètres des lumières en fonction du temps.
Cherchez dans un tutoriel openGL comment définir une lumière de type
spot et testez par exemple l'atténuation de la lumière en fonction
de la distance.
UJF - M2 IICAO 2005-2006 : Infographie
TP3 : Illumination et modèle d'éclairage
This document was generated using the
LaTeX2HTML translator Version 2002-2-1 (1.70)
Copyright © 1993, 1994, 1995, 1996,
Nikos Drakos,
Computer Based Learning Unit, University of Leeds.
Copyright © 1997, 1998, 1999,
Ross Moore,
Mathematics Department, Macquarie University, Sydney.
The command line arguments were:
latex2html -split 0 -show_section_numbers TP3.tex
The translation was initiated by Mathieu Coquerelle on 2005-10-17
Mathieu Coquerelle
2005-10-17