Nous allons utiliser la bibliothèque GLUT (GL Utility Toolkit) qui fournit plusieurs fonctions pour faciliter l'utilisation d'OpenGL.
GLUT n'est pas installé sur les stations,
Matrice MODELVIEW
- Passe les coordonnées des objets à dessiner (modèles) dans le repère de la caméra. Définit un repère !
- La position de la caméra est en général (0,0,0) donc la matrice MODELVIEW représente la position où sera dessiné le prochain objet.
Matrice PROJECTION
- Clippe les coordonnées des points et les projette
Division perspective
- Division par la coordonnée homogène w pour obtenir des coordonnées normalisées
Viewport transformation
- Passage en pixel pour dessin dans une partie d'une fenêtre graphique (viewport)
Il existe une "matrice courante" que l'on spécifie avec la commande glMatrixMode(GL_MODELVIEW) ou glMatrixMode(GL_PROJECTION)
En général on travaille tout le temps sur la matrice MODELVIEW sauf lorsqu'on doit modifier les paramètres intrinsèques de la caméra (focale, taille du viewport, etc...).
On peut multiplier la matrice courante par une matrice quelconque avec glMultMatrix.
La fonction glLoadIdentity() permet de reinitialiser la matrice courante à la matrice identité.
Seuls les objets situés entre les plans near et far seront dessinés (opération effectuée lors du cliping).
La caméra regarde l'axe des y.
// on choisi la matrice courante glMatrixMode(GL_MODELVIEW); // on la change en l'identité glLoadIdentity(); // si on veut faire tourner le cube autour de l'axe passant par // (0,0,0) et (1,1,0) glRotatef(30,1.0,1.0,0.0); // on translate le cube en (1,2,3)) glTranslatef(1.0,2.0,3.0) // on dessine le cube glutWireCube(0.8);Attention, l'ordre des transformations se fera en remontant, ie: translation puis rotation.
les couleurs ont ici 3 composantes: R (rouge), V (vert), B (bleu), et sont positionnées avec glColor3f(R,V,B).
mais on peut en définir une 4eme pour la transparence, ainsi on pourra rendre les objets plus ou moins opaque pour voir plus ou moins à travers (fonction glColor4f).
// initialisation glutInit(&argc, argv); // initialisation du mode d'affichage glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); // taille et position de la fenetre de l'application glutInitWindowSize (250, 250); glutInitWindowPosition (100, 100); // creation de la fenêtre glutCreateWindow ("Exemple"); // couleur du fond (ici: noir) glClearColor (0.0, 0.0, 0.0, 0.0); // positionnement du nom de la fonction permettant de dessiner le // contenu de la fenêtre glutDisplayFunc(display); // positionnement du nom de la fonction appelée lors du // redimensionnement de la fenêtre de l'appliquation glutReshapeFunc(reshape); // pour démarrer une boucle infinie (pour l'instant) glutMainLoop(); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMainLoop();
Pour définir un point en 3D défini avec des coordonnées de type "float", il faut utiliser glVertex3f(x,y,z), où 3 pour 3 dimensions, f pour le typage, et x,y,z sont les coordonnées.
Des structures particulières peuvent être construites en utilisant des points définis par glVertex3f. On défini le type de structure et on délimite les points de cette structure par
glBegin(GL_LINES); glVertex3f(0,0,0); glVertex3f(1,0,0); glEnd();
glBegin(GL_LINES); glVertex3f(0,0,0); glVertex3f(1,0,0); glVertex3f(0,0,0); glVertex3f(0,0,1); glEnd();
glBegin(GL_QUADS); glVertex3f(0,0,0); glVertex3f(1,0,0); glVertex3f(0,1,0); glVertex3f(0,0,1); glEnd();
pour utiliser les touches du clavier, il suffit de définir une fonction (par exemple "key") donc l'entête est static void key(unsigned char c, int x, int y) où c correspondra au caractère tapé.
Il n'y a plus qu'à déclarer dans le "main" le nom de la
fonction
en charge de caractères tapés au clavier ainsi:
glutKeyboardFunc(key);
Pour forcer à redessiner la scène, il faut utiliser la fonction
glutPostRedisplay();
Exemple
OpenGL permet d'afficher un objet avec composition de la couleur de chacun de ses pixels avec la couleur du pixel déjà présent dans l'image à cette place -> transparence.
Le niveau de transparence est considéré comme une composante supplémentaire de la couleur, elle peut être définie avec glColor4f(R,V,B,alpha) où alpha désigne le niveau de transparensce entre 0 et 1.
ATTENTION: La composition entre les pixels présents et placés implique que l'ordre de dessin des objets graphiques a une influence sur l'image finale.
Le lissage permet d'attenuer l'aspect des facettes des objets en modes facettes.
Il existe deux méthodes de lissage: uni (tous les pixels d'une même facette seront de la même couleur) et Gouraud (interpolation linéaire en fonction des facettes voisines, voir partie sur l'éclairage). Pour utiliser le lissage: glShadeModel(GL_FLAT); pour uni, glShadeModel(GL_SMOOTH); pour Gouraud.L'activation de l'éclairage se fait grâce à glEnable(GL_LIGHTING);
float blanc[4] = { 1.0,1.0,1.0,1.0 }; float noir[4] = { 0.0,0.0,0.0,1.0 }; glLightfv(GL_LIGHT0, GL_DIFFUSE, blanc);// couleur de lumière diffuse glLightfv(GL_LIGHT0, GL_AMBIENT, noir); // couleur de lumière ambiantedonnera une lumière blanche avec une lumière ambiante noire.
pname |
rôle |
GL_AMBIENT | (R,G,B,A): couleur de la lumière ambiante ajoutée à la scène |
GL_DIFFUSE |
(R,G,B,A): couleur de la lumière diffuse liée à la source lumineuse |
GL_SPECULAR |
(R,G,B,A): couleur de la lumière spéculaire liée à la source lumineuse |
GL_POSITION | (x,y,z,w): position de la lumière
|
GL_SPOT_DIRECTION | orientation du cone d'ouverture dans le cas d'un spot |
GL_SPOT_EXPONENT | exposant d'un spot (plus l'exposant est grand plus le spot est focalisé sur son axe) |
GL_SPOT_CUTOFF | angle d'ouverture d'un spot |
Pour donner la position de la lumière 0: glLightfv(GL_LIGHT0,GL_POSITION,light0_pos);
Pour allumer la lumière 0:
glEnable(GL_LIGHT0);.
Pour éteindre la lumière 0:
glDisable(GL_LIGHT0);.
Il faut définir le type de surface de chaque objet afin
d'en déterminer les propriétés reflectrices.
Pour simplifier, utilisez:
L'opération de texturage consiste à recouvrir un objet d'une image pour donner l'impression que cet objet est constitué du matériel représenté sur l'image (du bois, du marbre, ...).
L'intérêt du texturage est que cette technique permet de créer de manière simple des détails sur les objets qu'il aurait fallu autrement modéliser au moyen de surfaces. Les modèles restent géométriquement simples et rapide d'affichage avec une qualité d'affichage qui être bonne ou même excellente.
Etapes de l'utilisation d'une texture:Le principal algorithme permettant d'obtenir des effets d'ombre sur les objets est le lancer de rayons (ray tracing, Appel(1968), Whitted(1980)). Dans sa formulation sommaire, le principe est le suivant :
Pour chaque point de l'écran (plan de projection),
En fait, un rayon lumineux ne se réfléchit pas seulement, il se transmet. Il faut donc tenir compte à la fois de la réflexion ( lumière spéculaire) et de la réfraction (lumière transmise). On est alors conduit à raffiner l'algorithme précédent en tenant compte pour toutes les intersections de la lumière réfléchie et de la lumière transmise.
On obtient ainsi pour chaque rayon visuel un arbre
de rayonnement dans lequel à chaque noeud i on applique la
relation plus complète
Ii=Iai+Idi+Isi+Iti
avec, dans le cas le plus simple, |