Vous êtes sur la page 1sur 44

Cours-4-5-6.

ps

Introduction OpenGL

INFORMATIQUE GRAPHIQUE
IFIPS, 3me anne
Cours 4, 5 et 6
PRSENTATION DU TUTORIEL
Rfrences

INTRODUCTION OPENGL

Christian Jacquemin (UniversitOpenGL


Paris
11librairie
et LIMSI-CNRS)
est une
graphique de bas niveau pour tracer des objets
gomtriques en dimension 2 ou 3.

Ce tutoriel est inspir des tutoriels en ligne de :

Nicole Deflaux Terry (Tulane University),

Matthew Suderman (McGill University).

Les objets complexes sont tracs partir de combinaisons dobjets lmentaires.


http://perso.limsi.fr/jacquemi/
OpenGL est indpendant du systme et du langage avec lesquels on l
utilise.

et des ouvrages :

OpenGL se lie avec les langages C ou C++ et avec dautres langages tels que
Java (package Java3D) ou Tcl.
OpenGL na pas de capacit de fentrage.

James D. Foley, Andries van Dam, Steven K. Feiner and John F. Hughes.
Computer Graphics: Principles and Practice in C, 2nd edition. Addison Wesley,
1995.

OpenGL est une machine tats finis.

Francis S. Hill, Jr., Computer Graphics Using Open GL, Second Edition, Prentice
Hall, 2000.

tout instant, on connat les paramtres graphiques courants du systme


(transformation, lumire...). Ils sont utiliss pour le trac courant.

Mason Woo, Jackie Neider, Tom Davis, OpenGL Programming Guide: The
Official Guide to Learning OpenGL, Version 1.2, Addison Wesley, 1999.

Page 1

Les tapes du pipeline de rendu graphique


1.Dfinition du modle mathmatique dun objet graphique
2.Dfinition dun point de vue de la scne graphique

PREMIER EXEMPLE 1/5


Trac dun rectangle blanc sur fond noir
Ce carr est obtenu par le programme src/opengl-exemple1.c.
Pour le compiler, utiliser Makefile

Cours-4-5-6.ps

LE PIPELINE GRAPHIQUE

3.Calcul des couleurs et des lumires


4.Rasterisation (transformation en points lumineux)
Les exemples donns dans ce cours reposent sur une programmation en C/C++ et
utilisent la librairie GLUT pour la gestion des fentres et des vnements.

PREMIER EXEMPLE 2/5

PREMIER EXEMPLE 3/5

Analyse du code

Analyse du code (suite)

Cration de la fentre graphique

Trac graphique

Dfinition de la taille de la fentre et de sa position. Cration de la fentre en lui


attribuant un titre.

linitialisation, on dfinit la couleur du fond qui sera utilise lorsqu'on


effacera le fond par glClear(GL_COLOR_BUFFER_BIT).

glutInitWindowSize(WIDTH, HEIGHT);
glutInitWindowPosition(0, 0);
glutCreateWindow("Premier exemple : carr");

GLvoid initGL() {
glClearColor(RED, GREEN, BLUE, ALPHA);

Le trac consiste dfinir une couleur (le blanc) et une forme :


un polygone quatre sommets dont les sommets sont numrs par glVertex3f.

Dfinition de trois fonctions de call-back


Ce sont des fonctions qui sont automatiquement appeles lorsque les
vnements correspondants sont intercepts :
window_display est appele chaque fois que lon doit redessiner la fentre,
window_reshape est appele chaque fois que lon redimensionne la fentre,
window_key est appele chaque fois quune touche clavier est presse.
glutDisplayFunc(&window_display);
glutReshapeFunc(&window_reshape); // voir transp. Premier exemple 5/5
glutKeyboardFunc(&window_key);
// voir transp. Boucle des vnements 3/3

Enfin, on indique OpenGL de tracer la scne graphique qui vient d'tre dfinie.
glFlush();
8

Page 2

glColor3f(1, 1, 1);
glBegin(GL_POLYGON);
glVertex3f(-1, -1, 0);
glVertex3f(1, -1, 0);
glVertex3f(1, 1, 0);
glVertex3f(-1, 1, 0);
glEnd();

PREMIER EXEMPLE 5/5

Analyse du code (suite)

Analyse du code (suite et fin)

Pipeline graphique

Redimensionnement de la fentre graphique

Avant d'tre trac, un point passe par :

GLvoid window_reshape(GLsizei width, GLsizei height)


{
glViewport(0, 0, width, height);

1.modle de vue (dfinition mathmatique des objets),


2.projection (point de visualisation de la scne),
3.port de vue (application une zone dcran).

Cours-4-5-6.ps

PREMIER EXEMPLE 4/5

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-2.0, 2.0, -2.0, 2.0, -2.0, 2.0);

En cas de redimensionnement de la fentre graphique, les transformations de


modle de vue et de projection sont redfinies :

// toutes les transformations suivantes sappliquent au modle de vue


glMatrixMode(GL_MODELVIEW);
}

1.le port de vue est modifi pour que la scne reprsente toujours la mme
fraction de la fentre,
2.la projection est modifie pour compenser la modification de la taille du port
de vue,
le volume de projection doit tre chang dans son rapport largeur sur hauteur
pour conserver les proportions des objets gomtriques.

10

BOUCLE DES VNEMENTS 1/3

BOUCLE DES VNEMENTS 2/3

Gestion des vnements clavier et souris

Analyse du code

Le programme src/opengl-boucle-evt1.c fournit des sorties dans le cas de la


rception des vnemts suivants :

Le programme principal contient la boucle prinicipale de gestion des vnements


utilisateur (librairie GLUT).

glutMainLoop();

touches clavier 'a' ou 'A',


touches spciales flche vers le haut ou vers la gauche et saut dune page
vers le haut,
clicks souris gauche (touche enfonce) et click droit (touche releve et
majuscule active).

Exemple dexcution
$ opengl-boucle-evt
Touche 'a'
Touche [<-]
La touche spciale 102 nest pas active.
Touche [^^]
La touche spciale 105 nest pas active.
Bouton gauche enfonc.
Bouton droite relev avec touche majuscule active.

Trois fonctions de call-back sont enregistres pour capturer et traiter ces


vnements :
// la gestion des vnements clavier
glutKeyboardFunc(&window_key);
// la gestion des vnements clavier (touches spciales telles que les ->)
glutSpecialFunc(&window_special_key);
// la gestion des vnements souris
glutMouseFunc(&window_mouse);

12

Page 3

11

Dfinition de trois fonctions de call-back

SYNTAXE DES COMMANDES OPENGL 1/3

Analyse du code (suite et fin)

Syntaxe gnrale des commandes graphiques OpenGL

Exemple de fonction de call-back : gestion dune touche ordinaire

Toutes les commandes OpenGL commencent par gl.


Celles qui commencent par glut sont de la librairie GLUT. Elles ne sont pas
implmentes sur toutes les plate-formes acceptant OpenGL.

Un choix selon la valeur de la touche presse.


Voir le fichier /usr/X11R6/include/GL/glut.h pour la liste des codes de touches
spciales et de leurs modifieurs ventuels.
GLvoid window_key(unsigned char key, int x, int y)
{
switch (key) {
case KEY_ESC:
exit(1);
break;
case 'a': case 'A':
printf ("Touche 'a'\n");
break;

Cours-4-5-6.ps

BOUCLE DES VNEMENTS 3/3

Les commandes sont gnralement encadres par un glBegin() (avec une


constante en GL_...) et un glEnd().
glColor3f(1, 1, 1);
glBegin(GL_POLYGON);
glVertex3f(-1, -1, 0);
glVertex3f(1, -1, 0);
glVertex3f(1, 1, 0);
glVertex3f(-1, 1, 0);
glEnd();

Il est recommand d'indenter entre un glBegin() et un glEnd().

default:
printf ("La touche %d n'est pas active.\n", key);
break;
}
}
13

14

SYNTAXE DES COMMANDES OPENGL 2/3

SYNTAXE DES COMMANDES OPENGL 3/3

Flexibilit sur les types des arguments

Cas de la commande glColor*()

Certaines noms de commandes OpenGL ont de 1 3 lettres finales qui dnotent


le nombre et le type de leurs paramtres.

Chaque commande OpenGL a une documentation associe accessible en ligne


http://www.opengl.org/developers/documentation/specs.html

Premier caractre : nombre de paramtres (2, 3, ou 4),

deuxime (et troisime ventuellement) caractre : type des arguments

Lorsqu'on nomme une commande type, on omet les lettres de typage en les
remplaant par une *.
par exemple glColor* dsigne glColor3b, glColor3d, glColor3f, glColor3i, glColor3s,glColor3ub,

f : float
d : double float
s : signed short integer
i : signed integer
b : character
ub : unsigned character
us : unsigned short integer
ui : unsigned integer

glColor3ui,
glColor4us,
glColor3dv,
glColor4dv,

glColor3us, glColor4b, glColor4d, glColor4f,glColor4i, glColor4s, glColor4ub, glColor4ui,


glColor3bv,
glColor3fv, glColor3iv, glColor3sv, glColor3ubv,glColor3uiv, glColor3usv, glColor4bv,
glColor4fv,glColor4iv, glColor4sv, glColor4ubv, glColor4uiv, glColor4usv

Trois exemples: On a la mme slection de couleur (le blanc opaque) avec :

dernier caractre (v) : argument sous forme dun vecteur au lieu dune liste
de scalaires.

16

Page 4

15

// 3 floats
glColor3f(1.0, 1.0, 1.0);
// 3 unsigned bytes
glColor3ub(255, 255, 255);
// 4 floats sous forme de vecteur
double vecteur[4] = {1.0, 1.0, 1.0, 1.0};
glColor4dv( v );

PRIMITIVES 2/3

Trac de primitives gomtriques

Primitives disponibles

Ces figures sont obtenues par le programme src/opengl-primitives1.c.

Les primitives suivantes sont disponibles aux programmeurs en OpenGL.

17

18

PRIMITIVES 3/3

VARIABLES D'TAT 1/6

Trac dune primitive gomtrique

Trac de primitives gomtriques

Toute primitive se trace au moyen dune suite de sommets donns par glVertex
et situs entre un glBegin() et un glEnd().

Ces figures sont obtenues par le programme src/opengl-var-etat1.c.

Cours-4-5-6.ps

PRIMITIVES 1/3

// figure en bas droite


glBegin(GL_TRIANGLE_FAN);
glVertex2f(-1.0, 1.0);
glVertex2f(1.0, 2.0);
glVertex2f(2.0, 0.0);
glVertex2f(1.0, -1.0);
glVertex2f(-2.0, -2.0);
glEnd();

Le trac effectif dune primitive na lieu que lors de la rencontre dune


commande glFlush()

20

Page 5

19

Variables dtat

VARIABLES D'TAT 3/6


Variables boolennes

Le trac graphique est affect par la valeur des variables dtat qui consituent
l'environnement graphique courant.

Variables de mode
Il existe deux modes dombrage dfinies par la commande glShadeModel qui
modifie la variable dtat de mode GL_SHADE_MODEL :

glShadeModel(GL_SMOOTH) : ombrage doux,

glShadeModel(GL_FLAT) : ombrage plat (la valeur par dfaut).

Les variables boolennes sont actives et dsactives au moyen des commandes


glEnable() et glDisable().

GL_POINT_SMOOTH : trac des points avec le filtrage correct ou antialiass,

GL_LINE_SMOOTH : trac des droites avec le filtrage correct ou antialiass,

GL_LINE_STIPPLE : trac en pointills pour les droites.

Exemple
// Dessine les points filtrs
// Exemple en haut droite
glEnable(GL_POINT_SMOOTH);

21

22

VARIABLES D'TAT 4/6

VARIABLES D'TAT 5/6

Variables dtat values

Variables dtat values (suite)

Des commandes spcifiques permettent de changer leur valeur.

Autres variables values

Leur valeur est accessible au moyen des commandes glGetBooleanv(),


glGetDoublev(), glGetFloatv(), ou glGetIntegerv().
Exemple : la couleur
glColor3f(0.0,
glColor3f(1.0,
glColor3f(0.0,
glColor3f(0.0,
glColor3f(1.0,
glColor3f(0.0,
glColor3f(1.0,
glColor3f(1.0,

0.0,
0.0,
1.0,
0.0,
1.0,
1.0,
0.0,
1.0,

0.0);
0.0);
0.0);
1.0);
0.0);
1.0);
1.0);
1.0);

Noir
Rouge
Vert
Bleu
Jaune
Cyan
Magenta
Blanc

Taille des points : glPointSize(GLfloat taille) o taille est la taille en


pixel souhaite pour le trac des points.
Largeur des lignes : glLineWidth(GLfloat largeur) o largeur est la
largeur en pixel souhaite pour le trac des lignes.
Lignes pointilles : glLineStipple(GLint facteur, GLushort patron) o
patron est une srie de 16 bits 0 (pas de trac) ou 1 (trac).
Ce patron est rpt autant que ncessaire pour le trac dune ligne.
Le paramtre facteur, entre 0 and 255, est un coefficient de dilatation du
patron.
GL_LINE_STIPPLE doit tre activ par glEnable(GL_LINE_STIPPLE).

24

Page 6

23

Cours-4-5-6.ps

VARIABLES D'TAT 2/6

Variables dtat values (fin)

TRANSFORMATIONS GOMTRIQUES 1/6


Transformations gomtriques (translation, rotation et changement d
chelle)

Exemple de ligne pointille


// Active le pointill
glEnable(GL_LINE_STIPPLE);
// Dfinit le patron de pointills 1 1 1 1 0 0 0 0 0 0 1 1 0 0 0 0
glLineStipple(2, 0x0C0F);

Cours-4-5-6.ps

VARIABLES D'TAT 6/6

Ces figures sont obtenues par le programme src/opengl-transf1.c.

glBegin(GL_LINES);
glVertex2f(-2.0, 0.0);
glVertex2f(2.0, 0.0);
glEnd();

25

26

TRANSFORMATIONS GOMTRIQUES 2/6

TRANSFORMATIONS GOMTRIQUES 3/6

Variable dtat : Mode de transformation


La commande glMatrixMode(GLenum mode) sert changer la valeur de la
variable dtat GL_MATRIX_MODE.
Trois valeurs possibles GL_MODELVIEW, GL_PROJECTION, et GL_TEXTURE.

Composition des transformations


Lorsque glMatrixMode() est appele, toutes les transformations suivantes
affectent la matrice de ce mode en se composant les unes aux autres.
Dans la suite, nous ne considrons que les compositions de transformations sur la
matrice de modle de vue.

La commande glLoadIdentity() sert rinitialiser la matrice courante la


matrice identit.
La commande glTranslate(TYPE x, TYPE y, TYPE z) multiplie la matrice
courante par une matrice qui dplace un objet de (x, y, z)
(ou qui, en dautres termes, dplace lorigine du mme vecteur).
// Rinitialisation de la matrice de modle de vue
glLoadIdentity();
// translation horizontale du triangle d'origine -> triangle rouge
glColor3f(1.0, 0.0, 0.0);
glTranslatef(1.5, 0, 0);
triangle();

28

Page 7

27

Translation

Rotation

TRANSFORMATIONS GOMTRIQUES 5/6


Changement dchelle

La commande glRotate(TYPE angle, TYPE x, TYPE y, TYPE z) multiplie la


matrice courante par une matrice qui fait tourner un objet d'une angle angle
autour de l'axe passant par l'origine et de vecteur directeur (x, y, z)

La commande glScale(TYPE x, TYPE y, TYPE z) multiplie la matrice


courante par une matrice qui fait trois homothties selon les trois axes du
repre de rapports (x, y, z)

(ou qui, en dautres termes, fait tourner le repre du mme angle autour du mme axe).

(ou qui, en dautres termes, multiplient les vecteurs unitaires des mmes rapports).

// translation verticale du triangle d'origine -> contour triangle vert


glTranslatef(0, 1.5, 0);
glColor3f(0.0, 1.0, 0.0);
triangleContour();
// rotation de 30 degrs autour de Oz dans le repre translat de (0, 1.5, 0)
// (donc centr au milieu de l'hypothnuse) -> triangle bleu
glRotatef(30, 0, 0, 1);
glColor3f(0.0, 0.0, 1.0);
triangle();

Attention, si un des paramtres du changement dchelle est nul,


cette dimension est perdue jusquau prochain glLoadIdentity().
// translation horizontale du triangle d'origine -> contour triangle jaune
glColor3f(1.0, 1.0, 0.0);
glTranslatef(-1.5, 0, 0);
triangleContour();
// changement dchelle de 1/2 sur chaque axe dans le repre translat de (-1.5, 0, 0)
// (donc centr au milieu de l'hypothnuse) -> triangle cyan
glColor3f(0.0, 1.0, 1.0);
glScalef(.5, .5, .5);
triangle();

29

30

TRANSFORMATIONS GOMTRIQUES 6/6

TRANSFORMATIONS DE PORT DE VUE 1/2

Changement dchelle de rapport ngatif : symttrie

Commande glViewport

Un changement dchelle ngatif par rapport un axe revient une symtrie


par rapport au plan perpendiculaire
compose avec une homothtie de rapport positif.

La transformation de port de vue revient choisir la taille du papier pour le tirage


dune photographie.

// translation verticale du triangle d'origine -> contour triangle magenta


glColor3f(1.0, 0.0, 1.0);
glTranslatef(0, -1.5, 0);
triangleContour();
// changement dchelle de -1 sur Oy et 1 sur Ox et Oz
// (une symtrie par rapport xOz)
// dans le repre translat de (0, -1.5, 0)
// (donc centr au milieu de l'hypothnuse) -> triangle gris
glScalef(1, -1, 1);
triangle();
glColor3f(0.5, 0.5, 0.5);

La commande glViewport(GLint x, GLint y, GLsizei largeur, GLsizei


hauteur)
place le coin haut gauche du port de vue en (x, y) et lui donne pour taille
(largeur, hauteur).
Cette commande est gnralement utilise en redimensionnement de la fentre
pour conserver la totalit de limage dans la fentre.

32

Page 8

31

Cours-4-5-6.ps

TRANSFORMATIONS GOMTRIQUES 4/6

Distorsion

PROJECTION ORTHOGRAPHIQUE 1/2


Le volume de vue dans une projection orthographique est un paralllpipde
rectangle.

Si la transformation de port de vue n'est pas dans les mmes proportions que
le rectangle proche du volume de vue, limage subit une distorsion.

Cours-4-5-6.ps

TRANSFORMATIONS DE PORT DE VUE 2/2

Proprit
Conserve le paralllisme quelle que soit lorientation des droites.
Conserve les rapports de longueurs sur des droites parallles.

Commande glOrtho
La commande glOrtho(GLdouble left, GLdouble right, GLdouble bottom,
GLdouble top, GLdouble near, GLdouble far) dfinit
- les dimensions des rectangles de clipping (proche et lointain)
- leurs positions sur Oz.

33

34

PROJECTION ORTHOGRAPHIQUE 2/2

PROJECTION EN PERSPECTIVE 1/2

Volume de vue en projection orthographique

Le volume de vue dans une projection orthographique est un tronc de


pyramide.

Proprit
Ne conserve pas le paralllisme :
des droites parallles convergent vers un point de fuite.
Les objets lointains apparaissent plus petits que les objets proches.

Commande glFrustum
La commande glFrustum(GLdouble left, GLdouble right, GLdouble
bottom, GLdouble top, GLdouble near, GLdouble far) dfinit
- les dimensions du rectangle de clipping proche
- les positions des rectangles de clipping proche et lointain sur Oz. Ces
distances doivent tre positives.

36

Page 9

35

Volume de vue en projection en perspective

DISPLAY LISTS 1/3


Trac de cercles et ellipses optimis par lutilisation de Display lists
Ces figures sont obtenues par le programme src/opengl-DL1.c.

37

DISPLAY LISTS 2/3

38

- GL_COMPILE les commandes sont compiles sans tre excutes,


- GL_COMPILE_AND_EXECUTE les commandes sont compiles et excutes.

Utilit des Display lists


Les display lists servent enregistrer en mmoire des commandes qui seront
excutes ultrieurement dans cet ordre.
Pour des objets tracs plusieurs fois, elles permettent deffectuer les calculs une
fois pour toutes et ainsi optimiser les programmes. De plus, elles utilisent, sur
les cartes graphiques appropries, des mcanismes d'accs mmoire (DMA)
acclrant le rendu graphique.

Dfinition des Display lists


Les commandes glNewList(GLuint name, GLenum mode) et glEndList()
dfinissent la display list didentificateur name.
L'identificateur name est un entier unique.
Il peut tre gnr par la commande glGenLists(GLuint nbListes).
GLuint displayList;

displayList = glGenLists(1);

Deux modes sont possibles :

DISPLAY LISTS 3/3


Exemple
Dfinition de la display list My_Circle
#define My_Circle 1
glNewList(My_Circle, GL_COMPILE);
glBegin(GL_POLYGON);
// Gnre les points du cercle
for(i = 0; i < 100; i++) {
cosine = cos(i * 2 * PI / 100.0);
sine = sin(i * 2 * PI/100.0);
glVertex2f(cosine, sine);
}
glEnd();
// Fin de la dfinition dun cercle
glEndList();

Invocation de la display list My_Circle

40

Page 10

glCallList(My_Circle);
39

Cours-4-5-6.ps

PROJECTION EN PERSPECTIVE 2/2

TRAC EN 3D 2/2

Trac d'un cube

Instructions pour le masquage des parties cachs en 3D

Cette figure est obtenue par le programme src/opengl-3D1.c.

Leffacement des parties caches est gr dans OPenGL au moyen du Z-buffer.

Cours-4-5-6.ps

TRAC EN 3D 1/2

Allocation du Z-buffer
placer dans linitialisation dOpenGL.
glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH);

Variable dtat dactivation du Z-buffer


placer dans linitialisation dOpenGL.
glEnable(GL_DEPTH_TEST);

Effacement du Z-buffer
placer avant chaque dessin de la scne.
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

41

42

ANIMATION 1/7

ANIMATION 2/7

Animation d'un cube par les touches + et -

Instructions pour l'animation par double buffer

Le programme src/opengl-anim1.c fait une animation d'un cube en rotation en


appuyant sur les touches + et -.

Lanimation est gre par deux buffers :


- un buffer de trac non visible (le buffer arrire)
- un buffer visible (le buffer avant).

Principe
Une animation est obtenue en modifiant progressivement les paramtres d
un affichage et en retraant la figure aprs chaque modification.
En raison de la persistence rtinienne, l'observateur voit une scne en
mouvement continu.
Dans le programme ci-dessus, langle de rotation du cube est modifi par lappui
sur les touches + et -.

Une fois le nouveau trac effectu, on permute les deux buffers au moyen de la
commande glutSwapBuffer() (librairie GLUT) aprs glFlush().
Allocation du double buffer placer dans linitialisation dOpenGL.
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);

change des deux buffers placer aprs chaque dessin de la scne.


glutSwapBuffers();

Modification des valeurs du trac


Aprs chaque modification des valeurs du trac, il faut redemander un affichage

43

44

Page 11

glutpostRedisplay();

ANIMATION 4/7

Animation automatique d'un cube par une fonction de call-back d'attente

Animation automatique (suite)

Le programme src/opengl-anim3.c fait une animation d'un cube en rotation


automatique.

Selon les machines, une mme animation automatique s'excutera plus ou


moins vite si l'on ne contrle pas le rythme de mise jour.

Dfinition dune fonction de call-back dattente

Dfinition d'une vitesse maximale d'animation

On dfinit une fonction de call-back d'attente qui est appele ds que le


systme ne traite plus un autre vnement ou un autre call-back.

On dfinit un intervalle minimal de rafrachissment de 40ms.

glutIdleFunc(&window_idle);

Cette fonction incrmente langle de rotation et demande le raffichage.


GLvoid window_idle()
{
angle++;
glutPostRedisplay();
}

void anime(int pas){


/* action effectuer en fonction du numro d'image */
if(pas == 2000) return;
/* redemande l'affichage */
glutPostRedisplay();
pas++;
/* rappellera la fonction d'animation anime dans 40 millisecondes au pus tt */
glutTimerFunc( 40, anime, pas );
}

Attention, la fonction de call-back dfinie par glutTimerFunc n'est appele


qu'une seule fois. Le programme src/opengl-anim4.c propose une animation
contrle par un temps de latence de 40ms.
45

46

ANIMATION 5/7

ANIMATION 6/7

Animation automatique (fin)

Animation d'un cube par dplacement de la souris

Quelques principes pour russir une animation:

Le programme src/opengl-anim6.c fait une animation d'un cube par dplacement


de la souris avec le bouton gauche enfonc.

temporiser les animations avec la fonction glutTimerFunc

avoir une variable globale unique t pour le temps,

Cours-4-5-6.ps

ANIMATION 3/7

lire le temps machine entre deux frames pour voir si le rythme de mise
jour est suffisant (au minimum 30 fps),
prvoir des procdures d'optimisation en cas de charge trop forte (niveaux
de dtail, maillage adaptatif, remplacement d'objets par des imposteurs...).

glutMouseFunc(&window_mouseFunc);

On note le lieu o a lieu un click souris de sorte grer les mouvements


relatifs de la souris lors de son dplacement.
GLvoid window_mouseFunc(int button, int state, int x, int y)
{
if (state == GLUT_DOWN && button == GLUT_LEFT_BUTTON) {
mouse_pos_x = x;
mouse_pos_y = y;
}
}

48

Page 12

47

Dfinition dune fonction de call-back de gestion des clicks souris (avant un dplacement)

CLAIREMENT 1/5

Animation par dplacement de la souris (suite et fin)

clairement d'une scne

Dfinition dune fonction de call-back de gestion des dplacement de la souris

Cette figure est obtenue par le programme src/opengl-eclair1.c.

Cours-4-5-6.ps

ANIMATION 7/7

glutMotionFunc(&window_motionFunc);

Cette fonction modifie langle de rotation en fonction des dplacements relatifs


de la souris et demande le raffichage.
GLvoid window_motionFunc(int x, int y)
{
angle_x += y - mouse_pos_y;
angle_y += x - mouse_pos_x;
mouse_pos_x = x;
mouse_pos_y = y;
glutPostRedisplay();
}

49

50

CLAIREMENT 2/5

CLAIREMENT 3/5

Instructions pour dfinir un clairement

Instructions pour dfinir un clairement (suite et fin)

Lclairement requiert :
- une ou plusieurs sources lumineuses,
- des proprits lumineuses sur les objets.

Dfinition des caractristiques lumineuses des objets (proprits matrielles)

Source lumineuse
placer dans linitialisation dOpenGL et dfinie par une position et une
couleur (blanc par dfaut).
// Cre une source de lumire directionnelle
glLightfv(GL_LIGHT0, GL_POSITION, position);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);

Variable dtat dombrage doux (vs. plat)

Par souci de simplicit, on donne comme proprit de lumire ambiante et


diffuse la couleur qui est dfinie par un appel glColor().
// La variable dtat de couleur GL_AMBIENT_AND_DIFFUSE
// est dfinie par des appels glColor
glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
glEnable(GL_COLOR_MATERIAL);

Pour chaque objet, on dfinit les proprits matrielles de la couleur spculaire


et du degr de brillance.
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular);
glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, shininess);

placer dans linitialisation dOpenGL.


// Dfinit un modle dombrage
glShadeModel(GL_SMOOTH);

52

Page 13

51

CLAIREMENT 5/5

Transparence en OpenGL

Dfinition de proprits matrielles

Cette figure est obtenue par le programme src/opengl-eclair4.c.

Dfinition directe des proprits matrielles avec une transparence

Cours-4-5-6.ps

CLAIREMENT 4/5

On donne quatre composantes: ambiente, diffuse, spculaire et brillance.


Les trois premires sont dfinies par trois composantes de couleur et une
transparence.
GLfloat
GLfloat
GLfloat
GLfloat

emeraldAmb[] = {0.0215, 0.1745, 0.0215, 0.5};


emeraldDiff[] = {0.07568, 0.61424, 0.07568, 0.5};
emeraldSpec[] = {0.633, 0.727811, 0.633, 0.5};
emeraldExp = 76.8;

glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, emeraldAmb);


glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, emeraldDiff);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, emeraldSpec);
glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, emeraldExp);

Il faut activer la gestion de la transparence.


glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

53

54

TEXTURE 1/5

TEXTURAGE 2/5

Texturage d'un objet

Instructions pour dfinir un texturage

Cette figure est obtenue par le programme src/opengl-texture1.c avec la texture


chaton.jpg.

Le texturage requiert :
- un bitmap dcrivant limage plaquer sur les faces,
- une association entre les sommets dun polygone et les coordonnes
de la texture (dlimite par un rectangle [0,1]x[0,1]).
Bitmap de la texture
On peut la charger au moyen de la libjpeg partir dun fichier jpeg.
Utiliser pour cela les fichiers fournis texjpeg.c et texjpeg.h.
CreateTexture(g_Texture, "chaton.jpg");

Variable dtat de texturage


placer dans linitialisation dOpenGL.
glEnable(GL_TEXTURE_2D);

56

Page 14

55

TEXTURE 4/5

Instructions pour dfinir un texturage (suite et fin)

Superpositions de textures transparentes

Paramtres du texturage

Cette figure est obtenue par le programme src/opengl-texture4.c avec les texture
montagne.png, arbre.png et nuages.png.

Dfinissent le mode d'application des textures.


glTexParameterf(GL_TEXTURE_2D,
glTexParameterf(GL_TEXTURE_2D,
glTexParameterf(GL_TEXTURE_2D,
GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D,

Cours-4-5-6.ps

TEXTURAGE 3/5

GL_TEXTURE_WRAP_S, GL_REPEAT);
GL_TEXTURE_WRAP_T, GL_REPEAT);
GL_TEXTURE_MAG_FILTER,
GL_TEXTURE_MIN_FILTER, GL_LINEAR);

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL ou GL_BLEND);

Application du texturage
Dfinissent lancrage de la texture sur le polygone lors du trac.
glBegin(GL_POLYGON);
glTexCoord2f( 0.0 ,
glTexCoord2f( 1.0 ,
glTexCoord2f( 1.0 ,
glTexCoord2f( 0.0 ,
glEnd();

1.0
1.0
0.0
0.0

);
);
);
);

glVertex3f(0,
glVertex3f(1,
glVertex3f(1,
glVertex3f(0,

0,
0,
1,
1,

0);
0);
0);
0);

57

58

TEXTURAGE 5/5
Texturage avec transparence
Chargement des textures
Les fichiers de textures contenant une composante alpha, on doit utiliser un
format qui l'accepte.
On peut les charger au moyen de la libpng partir dun fichier png.
Utiliser pour cela les fichiers fournis texpng.c et texpng.h.

lments de gomtrie dans l'espace

CreateTexturePNG(&g_Texture[0], "montagne.png" );
CreateTexturePNG(&g_Texture[1], "arbre.png" );
CreateTexturePNG(&g_Texture[2], "nuages.png" );

Activer la transparence sur les textures et sur les primitives


placer dans linitialisation dOpenGL.
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

60

Page 15

59

PRODUIT VECTORIEL 2/3

Formule

Proprits algbriques

a x b = (ay bz - az by) i + (az bx - ax bz) j + (ax by - ay bx) k

Vecteurs unitaires
ixj=k
jxk=i
kxi=j
Antisymtrie
b x a = -(a x b)
Linarit
a x (b + c) = a x b + a x c
Homognit
k . (a x b) = (k . a) x b

Calcul et reprsentation

61

62

PRODUIT VECTORIEL 3/3

COORDONNES HOMOGNES EN 3D

Proprits gomtriques

Cours-4-5-6.ps

PRODUIT VECTORIEL 1/3

Dfinition

Le produit vectoriel est nul si et seulement si les deux vecteurs sont


linairement dpendants (colinaires).

(a x b) est orthogonal a et b.

On passe des coordonnes cartsiennes aux coordonnes homognes en


ajoutant une quatrime coordonne
. 1 pour les points
. 0 pour les vecteurs
Dans le sens inverse, il faut ramener la quatrime coordonne du point 1 par
proportionnalit avant de la supprimer.

Oprations sur les points et vecteurs en 3D

L'angle (a, b) est mesur de a b ou de b a afin d'tre compris entre 0 et


180.
La direction du vecteur a x b est donne par la rgle des trois doigts de la
main droite.

La diffrence de deux points est un vecteur.

La somme d'un point et d'un vecteur est un point.

La combinaison lineaire de vecteurs est un vecteur.

La combinaison affine de points est un point.

Application immdiate : recherche de la normale un plan.


64

Page 16

63

Dfinition

QUATIONS PARAMTRIQUES DE PLANS


quation paramtrique

La combinaison affine ou barycentre de n points M1...Mn est :

Cours-4-5-6.ps

COMBINAISONS AFFINES DE POINTS EN 3D

Le point M, combinaison affine de n points M1...Mn, appartient lenveloppe


convexe des points M1...Mn si et seulement si
0 <= xi <= 1 pour tout i

M(s, t) = s B + t C + (1 - s - t) A

65

66

QUATIONS NORMALES DE PLANS

MORCEAUX DE PLANS

quation normale ou implicite

Dfinition

Soit n un vecteur normal et A un point du plan, l'quation normale est donne


par :
AM . n = 0 <=> (x - xA) . xn + (y - yA) . yn + (z - zA) . zn = 0

M(s, t) = A + s u + t v
avec des valeurs bornes pour s et t, afin de ne parcourir qu'un paralllogramme.

Un plan d'quation implicite a x + b y + c z = d

a pour vecteur normal n( a, b , c ),


d = n . (A - O).

Si
0 <= s <= 1 et
0 <= t <= 1 et
lintrieur du triangle ABC

68

alors M se trouve

Page 17

67

0 <= s + t <= 1,

GOMTRIE CONSTRUCTIVE DES SOLIDES:


OPRATIONS DE BASE

Buts
Construire des solides complexes partir doprations lmentaires sur des
solides lmentaires.

Dfinitions
S = S1 Oper S2

limiter les librairies dobjets gomtriques lmentaires,


fournir des mcanismes opratoires pour la constructions des solides par
agglomration, intersection ou extrusion,
fournir un mcanismes rcursif de construction dobjets permettant la
cration de librairies.

Cours-4-5-6.ps

GOMTRIE CONSTRUCTIVE DES SOLIDES: BUTS

Union:
Le solide S est la runion des deux solides S1 et S2. Les frontires sont conserves.
Intersection:
Le solide S est constitu des enveloppes communes aux deux solides S1 et S2.
Difference:
Le solide S est le solide S1 dont on a soustrait le volume du solide S2.
Merge:
Le solide S est la runion des deux solides S1 et S2. Les frontires incluses sont effaces.

69

70

GOMTRIE CONSTRUCTIVE DES SOLIDES:


EXEMPLE (1/3)

GOMTRIE CONSTRUCTIVE DES SOLIDES:


EXEMPLE (2/3)

Modlisation dune bobine

Visualisation avec POVray

Solide construit partir de volumes lmentaires

72

Page 18

71

Cours-4-5-6.ps

GOMTRIE CONSTRUCTIVE DES SOLIDES:


EXEMPLE (3/3)
Dfinition en POVray
intersection {
difference {
// exterieur de la bobine
union{
// bord superieur C1
cone { <0, 0, 1.0>, 1, <0, 0, 0.0>, 0 }
// bord inferieur C2
cone { <0, 0, 1.0>, 0, <0, 0, 0.0>, 1 }
// support du fil Cy1
cylinder{ <0, 0, 1.0>, <0, 0, 0.0> .7 }
}

lments de transformations dans l'espace

// axe de la bobine Cy2


cylinder{ <0, 0, 2.0>, <0, 0, -1.0> .3 }
}
// bord exterieur de la bobine Cy3
cylinder{ <0, 0, 2.0>, <0, 0, -1.0> .9 }
}

73

74

TRANSFORMATION AFFINE EN COORDONNES


HOMOGNES 1/2

TRANSFORMATION AFFINE EN COORDONNES


HOMOGNES 2/2

Forme gnrale

Trois exemples

La matrice d'une transformation affine est une matrice 4x4 qui conserve la
quatrime coordonne :

76

Page 19

75

Une matrice est inversible si et seulement si son dterminant est non nul.

Dterminant d'une matrice 3x3

INVERSE D'UNE TRANSFORMATION AFFINE 2/3


Calcul de la matrice inverse d'une matrice 3x3
On calcule la transpose de la matrice des cofacteurs et on la divise par le
dterminant de la matrice.

77

78

INVERSE D'UNE TRANSFORMATION AFFINE 3/3

ROTATIONS 1/12

Exemples

Les trois rotations autour des axes

Translation

Les trois rotations de base autour des axes sont des rotations dans le sens
inverse des aiguilles d'une montre lorsqu'on regarde vers les coordonnes
ngatives.

L'inverse d'une translation de vecteur v est une translation de vecteur -v.

Cours-4-5-6.ps

INVERSE D'UNE TRANSFORMATION AFFINE 1/3

Changement d'chelle de centre O


L'inverse d'un changement d'chelle de centre O et de rapports Sx, Sy et Sz
est un changement d'chelle de centre O et de rapports 1/Sx, 1/Sy et 1/Sz.
Glissement
L'inverse d'un glissement parallle Oy de rapport f est un glissement
parallle Oy de rapport -f.

80

Page 20

79

Matrices des rotations de base autour des axes


La matrice de la rotation autour de Oy semble diffrente.
Elle ne l'est pas si l'on considre une permutation cyclique des axes Ox, Oy et Oz.

ROTATIONS 3/12
Compositions de rotations autour des axes

Les rotations autour des axes ne commutent pas.

Cours-4-5-6.ps

ROTATIONS 2/12

Forme gnrale d'une composition de rotations autour des axes :


M = Rz(t3) . Ry(t2) . Rx(t1). t1, t2 et t3 sont appels les angles d'Euler.

81

82

ROTATIONS 4/12

ROTATIONS 5/12

Rotation autour d'un axe quelconque

Factorisation d'une rotation

Rotation autour d'un axe passant par l'origine et dfini par un vecteur unitaire U.

Factorisation d'une rotation autour d'un axe quelconque U en rotations Rx, Ry et


Rz autour des axes du repre.
On rsoud l'galit suivante :

Si on laisse de ct les cas particuliers :

84

Page 21

83

ROTATIONS 7/12

Quaternions

Quaternion associ une rotation

Dfinition: q = w + xi + yj +zk

Proprit: Un quaternion unitaire q = cos  + sin  reprsente reprsente la


rotation d'un angle 2  autour de l'axe

Addition: q+q' = w + w' + (x + x')i + (y + y')j + (z + z')k


Produit: q.q' = (w y' - x z' + y w' + z x') + (w x' + x w' + y z' - z y')i
+ (w y' - x z' + y w' + z x')j + (w z' + x y' - y x' + z w')k
(avec ii=jj=kk=1 et ij=-ji=k, jk=-kj=i, ki=-ik=j).

Cours-4-5-6.ps

ROTATIONS 6/12

Puissance d'un quaternion unitaire: qt = cos(t ) + sin(t )


L'image du vecteur v par la rotation R s'obtient ainsi:
R(v) = q v q*

Norme: N(q) = ww + xx + yy + zz
Conjugu: q* = w - xi - yj - zk

Produit de quaternions et composition de rotations

Addition: q+q' = w + w' + (x + x')i + (y + y')j + (z + z')k

La rotation par la compose de deux rotations R1 et R2, associes aux quaternions

Inverse: q-1 = q* / N(q)

q1 et q2, est la rotation associe au quaternion q1 q2.


R2 (R1(v)) = q2 q1 v q1* q2* = (q2 q1) v (q2 q1)*

En informatique graphique on ne considre que des quaternions unitaires, les


seuls encodant des rotations.

85

86

ROTATIONS 8/12

ROTATIONS 9/12

Matrice de rotation associe un quaternion

Exemple de quaternions

On utilise les formules


R = I + S sin  + S2 (1 - cos ) et q = cos  + sin 

Symtries par rapport aux axes x, y, z

Pour en dduire la matrice de rotation en fonction des composantes w, x, y, z d'un


quaterion unitaire.

Rx,  = (0, (1, 0, 0))


Ry,  = (0, (0, 1, 0))
Rz,  = (0, (0, 0, 1))

Rz,  ( Ry,  )

88

Page 22

87

(0, (0, 1, 0)) . (0, (0, 0, 1)) = (0, (1, 0, 0)) = Rx, 

ROTATIONS 11/12

Avantage des quaternions par rapport aux rotations: interpolation

Interpolation SLERP entre deux quaternions

Les quaternions s'interpolent facilement et permettent donc de dfinir des


animations sur des rotations partir de positions cls.

Problme: soit deux quaternions q1 et q2, on cherche interpoler ces deux


quaternions sur la sphre unitaire en parcourant le grand cercle qui les joint.

Cours-4-5-6.ps

ROTATIONS 10/12

Pour qu'une interpolation entre des quaternions soit correcte, il faut qu'elle se
fasse sur la sphre unit.
L'interpolation de 2 quaternions q1 et q2 revient chercher l'arc de longueur
minimale sur la sphre unit et le parcourir vitesse angulaire constante:
Spherical Linear Interpolation, SLERP.

89

90

ROTATIONS 12/12

CHANGEMENT DE REPRE

Interpolation SLERP entre deux quaternions (suite)

Calcul des nouvelles coordonnes

Solution: la solution suivante

.
.
.
.

q(t) = (q2.q1-1)t q1

soit
soit
soit
soit

deux repres R et R',


M la matrice de la transformation T telle que T(R)=R'
(x, y, z, 1 ) les coordonnes de P dans (R),
(x', y', z', 1 ) les coordonnes de P dans (R'),

vrifie

q(0) = q1 et q(1) = q2
N(q(t)) = 1
puisque l'angle de qt est une fonction affine de t, la rotation se fait avec une
vitesse angulaire uniforme.

Formule:
q(t) = q2t . q1(1-t)
q(t) = (cos t2 + 2 sin t2) (cos (1-t)1 + 1 sin (1-t)1)

92

Page 23

91

Se gnralise un enchanement de changements de repres M1, M2, M3.


La matrice M devient la matrice M1.M2.M3.

TRANSFORMATION FENTRE PORT DE VUE 2/2

Finalit

Matrice de la transformation rsultante

Transformer une fentre dans les coordonnes du monde vers un port de


vue dans les coordonnes de l'cran.

M = T(umin, vmin) . S((umax - umin) / (xmax - xmin), (vmax - vmin) / (ymax - ymin)) . T(xmin, -ymin)

Cours-4-5-6.ps

TRANSFORMATION FENTRE PORT DE VUE 1/2

La transformation prcdente doit tre compose avec un clipping sur la


fentre dans les coordonnes du monde pour n'afficher que les parties
pertinentes de la figure.

93

94

VISUALISATION 3D

PROJECTION EN PERSPECTIVE 1/7

Modle conceptuel de la visualisation 3D

Dfinition

Afficher sur un plan une scne complexe en 3 dimensions.

L'image d'un point M par une projection en perspective sur le plan P de centre O
est l'intersection de la droite OM avec le plan P.

Deux types principaux de projections.

en perspective : selon un centre de projection,


parallle : selon une direction de projection.

96

Page 24

95

Une projection en perspective dont le centre de projection est l'infini est une
projection parallle.

Point de fuite

PROJECTION EN PERSPECTIVE 3/7


Proprits gomtriques des projections en perspective

Si une droite D coupe le plan de projection,


il existe un point F, appel point de fuite appartenant la projection de toute
droite parallle D.

On diffrencie les projections en perspective par le nombre de points de fuite pour


les directions des axes du repre
(le nombre d'intersections des axes de coordonnes avec le plan).

Les projections ne conservent pas le paralllisme des droites non parallles au


plan de projection.

Cours-4-5-6.ps

PROJECTION EN PERSPECTIVE 2/7

La taille d'un objet est inversement proportionnelle sa distance au point de


projection :
|p(M) p(M')| = d0 . 1/d . |MM'|

en gnral deux points de fuite (camra verticale non parallle un des


axes),
le troisime point de fuite n'augmente pas significativement le ralisme.

97

98

PROJECTION EN PERSPECTIVE 4/7

PROJECTION EN PERSPECTIVE 5/7

Calcul des coordonnes projetes en perspective

Calcul de la profondeur dans une projection en perspective

On se place dans le cas d'une projection canonique :


Centre de projection l'origine et plan de projection parallle xOy.

Pseudo-profondeur

Coordonnes dans le plan de projection

On conserve une valeur de la profondeur telle que deux points ayant la mme
projection soient distingables.
On utilise une fonction homogne avec celle de x et y :
z'M = (a . zM + b) / (-zM)
et on choisit z'M = -1 pour zM = -near et z'M = 1 pour zM = -far
(On rend les faces avant et arrire du volume de vue coplanaires avec les
faces du volume de vue canonique.)
a = -(far + near) / (far - near)

b = -2 (far . near) / (far - near)

100

Page 25

99

et

PROJECTION EN PERSPECTIVE 7/7

Matrice d'une projection en perspective en coordonnes homognes

Trois exemples de projections en perspective

Se dduit des rsultats des deux transparents prcdents

Projection sur un des plans du repre d'un cube dont les artes sont
parallles aux axes du repre

Elle est obtenue en multipliant x'M, y'M, z'M et w'M (=1) par -zM :

avec un seul point de fuite (1),


cube plein avec deux points de fuite (2)
et cube plein avec trois points de fuite (3).

101

102

PROJECTION PARALLLE 1/5

PROJECTION PARALLLE 2/5

Dfinition

Cours-4-5-6.ps

PROJECTION EN PERSPECTIVE 6/7

Deux types de projections parallles

L'image d'un point M par une projection parallle sur le plan P d'axe D est
l'intersection de la droite parallle D passant par M avec le plan P.

projection orthographique lorsque la direction de projection est


perpendiculaire au plan de projection,
projection oblique sinon.

Proprits gomtriques des projections parallles

Les projections parallles conservent les rapports des distances selon une
direction donne.

104

Page 26

103

Les projections parallles conservent le paralllisme des droites.

PROJECTION PARALLLE 4/5

Quelques projections orthographiques

Quelques projections orthographiques (suite)

Projections selon les axes

Projections axonomtriques

Vues de face, de profil et de dessus.


Angles et distances dans les plans parallles aux plans du repre sont
conservs.

selon un plan qui coupe les axes.


Les distances sont modifies dans un rapport constant sur chaque axe.

Si le plan de projection fait le mme angle avec les trois axes, il s'agit
d'une projection isomtrique.
Le rapport des distances est le mme pour les 3 axes.

105

106

PROJECTION PARALLLE 5/5

VOLUME DE VUE 1/2

Projection cavalire

Cours-4-5-6.ps

PROJECTION PARALLLE 3/5

Volume de vue en projection orthographique

La direction de projection fait un angle de 45 avec le plan de projection.

Les longueurs sont conserves sur les trois axes.

Volume de vue canonique : projection parallle Oz en regardant vers les z


ngatifs.
Pour se ramener un volume de vue canonique, on effectue une rotation du
repre.

108

Page 27

107

Volume de vue en projection en perspective


Volume de vue canonique : les faces proche et lointaine du tronc de pyramide
sont parallles xOy.
La camra est en O.

MATRICE D'UNE PROJECTION 1/6


Matrice en coordonnes homognes de la projection orthographique
canonique

Cours-4-5-6.ps

VOLUME DE VUE 2/2

(x'M, y'M, z'M, w'M) = (xM, yM, 0, 1)

Pour se ramener un volume de vue canonique, on effectue une rotation et une translation
du repre.

109

110

MATRICE D'UNE PROJECTION 2/6

MATRICE D'UNE PROJECTION 3/6

Coordonnes en perspective canonique


Coordonnes du point projet en fonction de celles du point source
(x'M, y'M, z'M) = (xM / (zM / near), yM / (zM / near), near)

Matrice en coordonnes homognes de la perspective canonique de centre


O
(x'M, y'M, z'M, w'M) = (xM / (zM / near), yM / (zM / near), near, 1)
<=> (x'M, y'M, z'M, w'M) = (xM, yM, zM, zM / near)

112

Page 28

111

Projection en perspective de centre quelconque

MATRICE D'UNE PROJECTION 5/6


Matrice en coordonnes homognes de la perspective de centre quelconque

P(M) = C + t . (M - C),
avec
0 <= t <= 1
et
C = (0, 0, near) + Q . (dx, dy, dz)

Cours-4-5-6.ps

MATRICE D'UNE PROJECTION 4/6

La valeur de t est trouve par les quations sur z :


l'ordonne z'M de p(M) est gale near.

113

114

MATRICE D'UNE PROJECTION 6/6

PROJECTION EN OPENGL 1/5

Spcialisations de la matrice de perspective

Dfinition d'une projection orthographique en openGL via glOrtho

La matrice se spcialise en des matrices de projections particulires en utilisant


les valeurs suivantes

glOrtho(left, right, bottom, top, near, far)

Proj orthogonale

nea
dx
Q
r
infin
0
0
i

dy

dz

-1

Perspective centre
near near 0
0 -1
O
Perspective
infin
0
cos a sin a -1
cavalire
i

116

Page 29

115

PROJECTION EN OPENGL 3/5

Dfinition d'une projection en perspective en openGL via glFrustum

Transformation vers le volume de vue canonique

glFrustum(left, right, bottom, top, near, far)

On veut ramener le tronc de pyramide de glFrustum au volume de vue


canonique qui s'tend de -1 1 dans les trois directions.

Cours-4-5-6.ps

PROJECTION EN OPENGL 2/5

1.La transformation selon Oz a dj t traite lors de la dfinition d'une


perspective par rapport un point (matrice Mpz).
-> le tronc de pyramide s'tend de -1 1 selon Oz
2.translation selon Ox de -(right + left)/2
-> s'tend de -(right - left)/2 (right - left)/2 selon Oz
3.et changement d'chelle selon Ox de 2/(right - left)
-> s'tend de -1 1 selon Ox
4.translation selon Oy de -(top + bottom)/2
-> s'tend de -(top - bottom)/2 (top - bottom)/2 selon Oz
5.et changement d'chelle selon Oy de 2/(top - bottom)
-> s'tend de -1 1 selon Oy
117

118

PROJECTION EN OPENGL 4/5

PROJECTION EN OPENGL 5/5

Transformation vers le volume de vue canonique

Matrice de projection sur le volume de vue canonique

La matrice de projection vers le cube dont les six faces sont aux coordonnes -1
et +1
s'obtient en effectuant le produit des trois matrices suivantes.

La composition des trois matrices prcdentes est donc une projection sur la
face z = -1 dans le volume de vue canonique (x, y et z appartiennent [-1
, 1]).

La matrice MPz est donne au transparent Projection en perspective 6/7.

Clipping, calcul des faces caches, transformation vers le port de vue et


transformations gomtriques sont simplifies par ce qu'elles oprent sur le
volume canonique.

120

Page 30

119

Les graphes de scnes


Les graphes de scnes sont des modles de descriptions de scnes complexes
trs utiliss en ralit virtuelle.
Ils sont modliss par plusieurs langages, nous nous contenterons de considrer
les primitives d'OpenGL (graphes de scnes procduraux) et Java3D (graphes de
scnes en modle objet).

Notion de graphe de scne

Ce cours reprend en partie les prsentations faites sur ce thme


SIGGRAPH'2000. Je remercie Sherif Ghali (Max Plank Institute) et Henri A. Sowizral
(Sun Microsystems Inc.) pour avoir mis ces prsentations disposition.

121

122

EXEMPLE DE GRAPHE DE SCNE 1/3

EXEMPLE DE GRAPHE DE SCNE 2/3

Cours-4-5-6.ps

INTRODUCTION

La description d'une grue par un graphe de scne


La grue se compose :
1.d'une cabine : un cube centr l'origine dont les artes sont alignes sur les
axes,
2.un bras B1 articul sur la cabine : un segment align sur l'axe des abscisses
dont une des extrmits est l'origine,
3.un bras B2 articul sur le bras B1 : un segment align sur l'axe des abscisses
dont une des extrmits est l'origine.
La solidarit entre les pices mcaniques fournit un structuration implicite
pour la description de la grue par un graphe de scne.

124

Page 31

123

Avantages d'une reprsentation hirarchique en animation

Toute transformation sur une des pices se rpercute sur l'ensemble


des pices qui en sont solidaires :
un mouvement de la cabine, va entraner un mouvement correspondant des
deux bras.

CAS GNRAL
Forme gnrale d'un graphe de scne
Les feuilles sont des objets graphiques et les noeuds intermdiaires des
transformations.

Cours-4-5-6.ps

EXEMPLE DE GRAPHE DE SCNE 3/3

Tous les tracs se font dans le repre canonique :


or de nombreuses librairies fournissent des primitives dont la position se
dfinit par rapport au repre canonique.

La structuration combine des impratifs gomtriques, fonctionnels et


graphiques.

125

126

STRUCTURES DE GRAPHE DE SCNE 1/2

STRUCTURES DE GRAPHE DE SCNE 2/2

Deux structures principales pour les graphes de scnes

Arbres ou Graphes acycliques orients pour les graphes de scnes

Les arbres : chaque noeud n'a qu'un seul anctre,


la transformation rsultante s'obtient par composition des transformations sur
le chemin menant de la racine au noeud courant.
Les graphes acycliques orients : permettent de partager des objets
gomtriques ou des sous-scnes sans les redcrire,
chaque chemin de la racine au noeud courant fournit une transformation
permettant de gnrer une des sous-scnes dcrite par ce noeud.

128

Page 32

127

IMPLMENTATION PROCDURALE 1/7

Implmentation procdurale

L'arbre de scne est parcouru dynamiquement par des appels successifs de


transformations puis de primitives graphiques.

Cours-4-5-6.ps

IMPLMENTATIONS DES GRAPHES DE SCNE

Des instructions de sauvegarde et restauration du contexte graphique


permettent une descente dans l'arbre avec rtablissement des conditions
d'appel.

Implmentation oriente objet

L'arbre de scne est dfini statiquement comme une structure de donne


hirarchique avec un mcanisme d'hritage.
Le visualiseur de ces donnes analyse et parcourt la structure de
donnes graphiques et gnre les images en s'appuyant sur une librairie
graphique.

130

IMPLMENTATION PROCDURALE 2/7

IMPLMENTATION PROCDURALE 3/7

131

132

Page 33

129

133

134

IMPLMENTATION PROCDURALE 6/7

IMPLMENTATION PROCDURALE 7/7

135

136

Page 34

IMPLMENTATION PROCDURALE 5/7

Cours-4-5-6.ps

IMPLMENTATION PROCDURALE 4/7

IMPLMENTATION ORIENTE OBJETS 2/3

137

138

IMPLMENTATION ORIENTE OBJETS 3/3

HRITAGE DANS LES GRAPHES DE SCNE J3D 1/3

Cours-4-5-6.ps

IMPLMENTATION ORIENTE OBJETS 1/3

Structure gnrale d'un arbre de scne en Java3D

High resolution locale : une origine pour les branch groups qui en
dpendent,
Branch group node : la racine d'un sous-graphe appel branch graph, les
seuls noeuds pouvoir tre attachs un locale,
Group node : les noeuds qui architecturent la scne graphique et ses
relations d'hritage,
Leaf node : les noeuds qui dfinissent les entits atomiques telles que les
primitives gomtriques, les lumires et les sons.
View platform object : vue de l'utilisateur au sein de l'univers virtuel.

140

Page 35

139

Virutal Universe : base d'un graphe de scne,

HRITAGE DANS LES GRAPHES DE SCNE J3D 3/3

141

142

Cours-4-5-6.ps

HRITAGE DANS LES GRAPHES DE SCNE J3D 2/3

COLLISIONS ET INTERSECTIONS: INTRODUCTION


Introduction
Mthodes rapides pour trouver les contacts/intersections entre volumes
modifier la scne en consquence: changements de trajectoires,
dformations.

Collisions et Intersections

La recherche systmatique des intersections entres des triangles de maillages


est lourde et inoprante.
Dans des scnes animes, l'oeil est assez tolrant aux approximations sur la
gestion des collisions.

On va donc effectuer des simplifications et des optimisations pour que la


gestion des intersections et des collisions soit compatible avec un rendu temps
reel.

144

Page 36

143

Applications du calcul des intersections

COLLISIONS ET INTERSECTIONS: EXEMPLE


Exemples d'effets spciaux gnrs en informatique graphique

vitement d'obstacles (ralit virtuelle, ralit augmente, jeux,


robotique...)

Saisie d'objets (tlmdecine, tlmaintenance, formation...)

Trac par lancer de rayon: rendu photo-raliste

Pointage (souris, wand...)

Cours-4-5-6.ps

COLLISIONS ET INTERSECTIONS: APPLICATIONS

Applications de la gestion des collisions

Simulation de systmes physiques (jeux, simulation scientifique, effets


spciaux et animation...)

Pixel Magic's web page: http://www.pixelmagicfx.com


DRIVEN Home Page: http://www.what-drives-you.com
DRIVEN (c) 2001 Warner Bros. and Franchise Pictures

145

146

COLLISIONS ET INTERSECTIONS: MTHODES

COLLISIONS: TAPES

Mthodes

tapes de calcul des collisions

Volumes englobants: simplification de la gomtrie et ventuellement


hirarchisation
Cohrence spatiale: rgularit gomtrique et connexit des volumes...
Cohrence temporelle: rgularit gomtrique et connexit des
trajectoires...

Dtection de collision: rponse boolenne sur la possibilit de collision


entre deux objets

Dtermination de collision: localisation prcise de la collision

Rponse: modifications cinmatiques et dformations gomtriques

148

Page 37

147

Collision d'un point avec un polydre

COLLISIONS: ARBRES BINAIRES DE PARTITION 2


Collision d'un point avec un polydre

On construit l'arbre binaire de partition de l'espace (BSP) associ au polydre (voir


cours Suppression de parties caches).

Cours-4-5-6.ps

COLLISIONS: ARBRES BINAIRES DE PARTITION 1

On complte l'arbre par des feuilles "vide" ou "solide".


Pour tout segment O1O2, on peut:

dterminer les objets avec lesquels il y a collision

les lieux de collisions sur le segment O1O2.

149

150

COLLISIONS: AUGMENTATION DU VOLUME 1

COLLISIONS: AUGMENTATION DU VOLUME 2

Collision d'une sphre (ou d'un cylindre) avec un polydre

Calcul du volume augment

Pour grer les collisions d'un objet non ponctuel,


on se ramne une intersection avec un objet ponctuel en crant un volume
augment simplifi.

O1 est une sphre (on raisonne en 3 dimensions) ou un cylindre (on raisonne en


deux dimensions).

Le volume augment exact est obtenu en prenant l'enveloppe de l'objet


pour toutes les positions o il est en contact avec le volume.
On simplifie en translatant les plans initiaux et en ajoutant des plans de
biseau.

152

Page 38

151

COLLISIONS: RPONSE 2

Rponse une collision

Impulsions dans un choc

On considre deux particules P1 et P2, de vitesses v1 et v2 entrant en collision.

Lors d'une collision entre 2 corps, les impulsions sont gales et opposes, compte
tenu de la 3e loi de Newton.

La rponse une collision est le calcul de la trajectoire des objets aprs une
collision.
Simplification: on ne tient pas compte des vitesses angulaires.

Notions

Cours-4-5-6.ps

COLLISIONS: RPONSE 1

Simplification: on suppose que les forces de frictions sont ngligeables dans le


choc, les impulsions sont donc portes par n, la normale la surface de contact.
I1 = m1 (v'1 - v1) = j n = -I2 = -m2 (v'2 - v2) [2]

La quantit de mouvement:
M=mv
L'impulsion sur une particule est sa variation de quantit de mouvement:
I = M = m v [1]

153

154

COLLISIONS: RPONSE 3

COLLISIONS: RPONSE 4

lasticit d'un choc

Calcul de j et des vitesses finales

Le coefficient de restitution mesure la perte d'nergie cintique dans la collision.

On calcule [3] pour les vitesses normales, on remplace par les valeurs de v'1 - v'2 trouves
dans [2] et on en dduit j et les vitesses finales:

Notation: le coeffcient de restitution est gal au rapport des vitesses relatives


avant et aprs la collision.
(v'1 - v'2) = e(v1 - v2) [3]

Dans un choc parfaitement lastique (e=1), les vitesses relatives sont


conserves.
Dans un choc compltement inlastique (e=0), les vitesses relatives finales
sont nulles.

[4]
Cas particulier: choc parfaitement lastique contre un mur
On considre que la masse du mur est infinie et on obtient

155

156

Page 39

[5]

Cas particulier: choc parfaitement lastique de deux projectiles

COLLISIONS: RPONSE 6
Cas de deux projectiles de mmes masses

Cours-4-5-6.ps

COLLISIONS: RPONSE 5

[7]

[6]

157

158

INTERSECTIONS: VOLUMES ENGLOBANTS INTRODUCTION

INTERSECTIONS: VOLUMES ENGLOBANTS HIRARCHIE

Utilit et typologie des volumes englobants

Hirarchie volumes englobants

Pour acclrer et simplifier les recherches d'intersections,


on cre des volumes englobants qui sont supposs contenir tout le volume
initial

Pour acclrer la recherche d'intersections,


on organise les volumes englobants en hirarchie au moyen d'arbres n-aires.
chaque niveau un noeud contient l'ensemble de ses descendants.

On examinera les volumes englobants suivants:

Polydres (botes): paralllpipdes rectangles aligns ou non sur les axes


et polydres faces opposes parallles (k-DOP).
Sphres et cylindres.

On dtaillera les intersections suivantes:

Droite/sphre et droite/bote: utiles en slection d'objets.

Bote/bote: gestion des collisions entre objets.

160

Page 40

159

Trois modes de construction

INTERSECTIONS: VOLUMES ENGLOBANTS - AABB


Axis-aligned Bounding Box (AABB)
Dfinie par un centre C, trois vecteurs unitaires i, j et k,
et trois demi-longueurs de cts: hx, hy et hz.

Mthode ascendante bottom-up

Cours-4-5-6.ps

INTERSECTIONS: VOLUMES ENGLOBANTS HIRARCHIE

combine des primitives sur des critres de proximit


Mthode descendante top-down
part d'un volume englobant maximal puis subdivision rcursive: recherche d'un
axe de subdivision et d'un lieu de subdivision sur cet axe
Insertion incrmentale d'arbre
insertion d'une nouvelle primitive chaque tape et
reconfiguration de l'arbre pour optimiser le placement de la primitive (pour
minimiser la profondeur de l'arbre obtenu)

161

162

INTERSECTIONS: VOLUMES ENGLOBANTS - OBB

INTERSECTIONS: VOLUMES ENGLOBANTS - K-DOP

Oriented Bounding Box (OBB)

Discrete Oriented Polytope (k-DOP)

Dfinie par un centre C, trois vecteurs unitaires bu, bv et bw,


et trois demi-longueurs de cts: hu, hv et hw.

Dfinie par k/2 vecteurs unitaires bu, bv et bw,


et k/2 couples limites de plaques (slabs): di,min, di,max.

164

Page 41

163

INTERSECTIONS: THORME SAT 2

Thorme de l'axe sparateur (Separating Axis Theorem)

Utilisation du thorme de l'axe sparateur

Pour deux polydres convexes P et P', disjoints, il existe un axe A sur lequel
la projection des polydres P et P' forme deux intervalles disjoints.
Un tel axe est appel axe sparateur.

Test de rejet dmontrant que deux polydres ont une intersection vide:

Si les polydres sont disjoints, il existe un axe sparateur orthogonal :


une face de P,
une face de P',
une arte de chacun des deux polydres.

Dans les deux premiers cas, on dfinit un plan sparateur.


Dans le dernier cas, on utilise le produit vectoriel des supports des axes pour
rechercher un axe sparateur.

On parcourt l'ensemble des axes orthogonaux une face d'un des deux
polydres puis l'ensemble des axes orthogonaux deux artes.
Si un de ces axes permet de sparer les polydres, on arrte, les deux
polydres sont disjoints.

Gnralisation: peut s'appliquer des polydes "dgnrs" comme des


triangles ou des droites.
Optimisation: on peut commencer par un test rapide sur des sphres
englobantes.
Applications: intersections de lignes/triangles/botes.

165

166

INTERSECTIONS: RAYON/SPHRE 1

INTERSECTIONS: RAYON/SPHRE 2

Intersection d'une demi-droite oriente avec une sphre (Haines 89)

Algorithme

Intersection d'une demi-droite O,v (v est un vecteur normalis)


avec une sphre de centre C et de rayon r.

l2 = l. l;
d = l . v;
if( l2 < r2 && d < 0 )
// sphre derrire l'origine et origine extrieure la sphre
return false;

Applications:
slections d'objets dont le volume englobant est une sphre par un pointeur,
optimisation du rendu par lanc de rayon.

Cours-4-5-6.ps

INTERSECTIONS: THORME SAT 1

h2 = l2 - d2;
if( h2 > r2 )
// le rayon ne coupe pas la sphre
return false;
// il y a intersection et on recherche le point d'intersection
d' = sqrt( r2 - h2 );
// origine dans la sphre, on retourne le point le plus lointain
if( l2 < r2 )
return d + d'
// origine hors de la sphre, on retourne le point le plus proche
else
return d - d'

168

Page 42

167

Intersection d'une demi-droite oriente avec une bote (Haines 89, Kay and
Kajiva 86)

INTERSECTIONS: RAYON/BOTE 2
lments gomtriques pour l'intersection d'une demi-droite avec une
bote

Cours-4-5-6.ps

INTERSECTIONS: RAYON/BOTE 1

S'inspire du clipping Cyrus-Beck vu en cours. On recherche les intersections entre


le rayon et chacune des plaques (ti,min et ti,max).
On calcule Tmin la plus grande des ti,min et Tmax la plus petite des ti,max.
- si Tmin > Tmax l'intersection est vide,
- sinon l'intersection est le segment [TminTmax].

169

170

INTERSECTIONS: RAYON/BOTE 3 - ALGORITHME

INTERSECTIONS: AABB/AABB

Tmin = - ; Tmax = + ;
for( i = { u , v , w } )
d1 = l . bi ; d'1 = l . ci ;
// rayon parallle la plaque
if( |d'1| <  ) {
// rayon hors de la la plaque
return false;
if( d1 < -hi || d1 > hi )
}
// rayon coupe la plaque
else {
// calcul des paramtres des intersections avec les cts de la plaque
t1 = min( (d1+hi)/d'1 , (d1-hi)/d'1 )
t2 = max( (d1+hi)/d'1 , (d1-hi)/d'1 )
// mise jour des minimaux et maximaux
if( Tmin < t1 ) Tmin = t1 ;
if( Tmax > t2 ) Tmax = t2 ;
// cas d'intersection vide (cf. Cyrus Beck)
if( Tmin > Tmax ) return false;
// plaque derrire l'origine du rayon
if( Tmax < 0 ) return false;
}
}
// intersection existe et la valeur minimale est devant l'origine
if( Tmin > 0 ) return Tmin;
// intersection existe et la valeur minimale est derrire l'origine
else return Tmax;

Algorithme
for( i = { u , v , w }
// axe sparateur
if( (ai,min > bi,max) || (ai,max < bi,min) ) {
return false;
return true;

172

Page 43

171

Intersection de deux botes alignes sur les axes

INTERSECTIONS: OBB/OBB 2

Intersection de deux botes orientes

Intersection de deux botes orientes en dimension 2

On recherche un axe sparateur sur:

Se ramne la recherche d'un axe sparateur sur les 4 axes des deux botes

Cours-4-5-6.ps

INTERSECTIONS: OBB/OBB 1

Les trois axes de chacune des deux botes.


Les 33=9 axes orthogonaux une arte de chacune des botes.

Optimisations:

Un faible prcision des calculs suffit


On peut ne faire la recherche que sur les 6 axes des botes, les rejets
sur les 9 autres axes sont assez rares et correspondent des cas limites.
On privilgie une bote qui devient une AABB, l'autre est situe par
translation et rotation partir de celle-ci.

173

174

INTERSECTIONS: OBB/OBB 3
Intersection de deux botes orientes: lments gomtriques
Sur chaque axe, on calcule la distance CC'.l de la projection des centres, ainsi que
le rayon r de la projection des botes:
r = hu |bu.l| + hv |bv.l| + hw |bw.l|
et
r' = h'u |b'u.l| + h'v |b'v.l| + h'w |b'w.l|
d = CC'.l - r - r'
Si d est strictement positif, on a un axe sparateur.

Page 44

175