Cours-4-5-6 (1).pdf

44
Cours-4-5-6.ps Page 1 INFORMATIQUE GRAPHIQUE Christian Jacquemin (Université Paris 11 et LIMSI-CNRS) http://perso.limsi.fr/jacquemi/ Introduction à OpenGL PRÉSENTATION DU TUTORIEL Références INTRODUCTION À OPENGL

Transcript of Cours-4-5-6 (1).pdf

Page 1: Cours-4-5-6 (1).pdf

Cours-4-5-6.ps

Page 1

INFORMATIQUE GRAPHIQUE

IFIPS, 3ème année

Cours 4, 5 et 6

Christian Jacquemin (Université Paris 11 et LIMSI-CNRS)

http://perso.limsi.fr/jacquemi/

1

Introduction à OpenGL

2

PRÉSENTATION DU TUTORIEL

Références

Ce tutoriel est inspiré des tutoriels en ligne de :

� Nicole Deflaux Terry (Tulane University),

� Matthew Suderman (McGill University).

et des ouvrages :

� 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.

� Francis S. Hill, Jr., Computer Graphics Using Open GL, Second Edition, PrenticeHall, 2000.

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

3

INTRODUCTION À OPENGL

OpenGL est une librairie graphique de bas niveau pour tracer des objetsgéométriques en dimension 2 ou 3.

Les objets complexes sont tracés à partir de combinaisons d´objets élémentaires.

OpenGL est indépendant du système et du langage avec lesquels on l´utilise.

OpenGL se lie avec les langages C ou C++ et avec d´autres langages tels queJava (package Java3D) ou Tcl.OpenGL n´a pas de capacité de fenêtrage.

OpenGL est une machine à états finis.

À tout instant, on connaît les paramètres graphiques courants du système(transformation, lumière...). Ils sont utilisés pour le tracé courant.

4

Page 2: Cours-4-5-6 (1).pdf

Cours-4-5-6.ps

Page 2

LE PIPELINE GRAPHIQUE

Les étapes du pipeline de rendu graphique

1.Définition du modèle mathématique d´un objet graphique

2.Définition d´un point de vue de la scène graphique

3.Calcul des couleurs et des lumières

4.Rasterisation (transformation en points lumineux)

Les exemples donnés dans ce cours reposent sur une programmation en C/C++ etutilisent la librairie GLUT pour la gestion des fenêtres et des événements.

5

PREMIER EXEMPLE 1/5

Tracé d´un rectangle blanc sur fond noir

Ce carré est obtenu par le programme src/opengl-exemple1.c.Pour le compiler, utiliser Makefile

6

PREMIER EXEMPLE 2/5

Analyse du code

Création de la fenêtre graphique

Définition de la taille de la fenêtre et de sa position. Création de la fenêtre en luiattribuant un titre.

glutInitWindowSize(WIDTH, HEIGHT);

glutInitWindowPosition(0, 0);

glutCreateWindow("Premier exemple : carré");

Définition de trois fonctions de call-back

Ce sont des fonctions qui sont automatiquement appelées lorsque lesévénements correspondants sont interceptés :window_display est appelée chaque fois que l´on doit redessiner la fenêtre,window_reshape est appelée chaque fois que l´on redimensionne la fenêtre, window_key est appelée chaque fois qu´une touche clavier est pressée.

glutDisplayFunc(&window_display);

glutReshapeFunc(&window_reshape); // voir transp. Premier exemple 5/5

glutKeyboardFunc(&window_key); // voir transp. Boucle des événements 3/3

7

PREMIER EXEMPLE 3/5

Analyse du code (suite)

Tracé graphique

À l´initialisation, on définit la couleur du fond qui sera utilisée lorsqu'oneffacera le fond par glClear(GL_COLOR_BUFFER_BIT).

GLvoid initGL() {

glClearColor(RED, GREEN, BLUE, ALPHA); }

Le tracé consiste à définir une couleur (le blanc) et une forme : un polygone à quatre sommets dont les sommets sont énumérés par glVertex3f.

glColor3f(1, 1, 1);

glBegin(GL_POLYGON);

glVertex3f(-1, -1, 0);

glVertex3f(1, -1, 0);

glVertex3f(1, 1, 0);

glVertex3f(-1, 1, 0);

glEnd();

Enfin, on indique à OpenGL de tracer la scène graphique qui vient d'être définie.

glFlush();

8

Page 3: Cours-4-5-6 (1).pdf

Cours-4-5-6.ps

Page 3

PREMIER EXEMPLE 4/5

Analyse du code (suite)

Pipeline graphique

Avant d'être tracé, un point passe par :

1.modèle de vue (définition mathématique des objets), 2.projection (point de visualisation de la scène), 3.port de vue (application à une zone d´écran).

En cas de redimensionnement de la fenêtre graphique, les transformations demodèle de vue et de projection sont redéfinies :

1.le port de vue est modifié pour que la scène représente toujours la mêmefraction de la fenêtre,

2.la projection est modifiée pour compenser la modification de la taille du portde vue, le volume de projection doit être changé dans son rapport largeur sur hauteurpour conserver les proportions des objets géométriques.

9

PREMIER EXEMPLE 5/5

Analyse du code (suite et fin)

Redimensionnement de la fenêtre graphique

GLvoid window_reshape(GLsizei width, GLsizei height)

{

glViewport(0, 0, width, height);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

glOrtho(-2.0, 2.0, -2.0, 2.0, -2.0, 2.0);

// toutes les transformations suivantes s´appliquent au modèle de vue

glMatrixMode(GL_MODELVIEW);

}

10

BOUCLE DES ÉVÉNEMENTS 1/3

Gestion des événements clavier et souris

Le programme src/opengl-boucle-evt1.c fournit des sorties dans le cas de laréception des événemts suivants :

� touches clavier 'a' ou 'A',

� touches spéciales flèche vers le haut ou vers la gauche et saut d´une pagevers le haut,

� clicks souris gauche (touche enfoncée) et click droit (touche relevée etmajuscule active).

Exemple d´exécution

$ opengl-boucle-evt

Touche 'a'

Touche [<-]

La touche spéciale 102 n´est pas active.

Touche [^^]

La touche spéciale 105 n´est pas active.

Bouton gauche enfoncé.

Bouton droite relevé avec touche majuscule active.

11

BOUCLE DES ÉVÉNEMENTS 2/3

Analyse du code

Le programme principal contient la boucle prinicipale de gestion des événementsutilisateur (librairie GLUT).

glutMainLoop();

Définition de trois fonctions de call-back

Trois fonctions de call-back sont enregistrées pour capturer et traiter cesévénements :

// la gestion des événements clavier

glutKeyboardFunc(&window_key);

// la gestion des événements clavier (touches spéciales telles que les ->)

glutSpecialFunc(&window_special_key);

// la gestion des événements souris

glutMouseFunc(&window_mouse);

12

Page 4: Cours-4-5-6 (1).pdf

Cours-4-5-6.ps

Page 4

BOUCLE DES ÉVÉNEMENTS 3/3

Analyse du code (suite et fin)

Exemple de fonction de call-back : gestion d´une touche ordinaire

Un choix selon la valeur de la touche pressée. Voir le fichier /usr/X11R6/include/GL/glut.h pour la liste des codes de touchesspéciales 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;

default:

printf ("La touche %d n'est pas active.\n", key);

break;

}

}

13

SYNTAXE DES COMMANDES OPENGL 1/3

Syntaxe générale des commandes graphiques OpenGL

Toutes les commandes OpenGL commencent par gl. Celles qui commencent par glut sont de la librairie GLUT. Elles ne sont pasimplémentées sur toutes les plate-formes acceptant OpenGL.

Les commandes sont généralement encadrées par un glBegin() (avec uneconstante 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().

14

SYNTAXE DES COMMANDES OPENGL 2/3

Flexibilité sur les types des arguments

Certaines noms de commandes OpenGL ont de 1 à 3 lettres finales qui dénotentle nombre et le type de leurs paramètres.

� Premier caractère : nombre de paramètres (2, 3, ou 4),

� deuxième (et troisième éventuellement) caractère : type des arguments

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

� dernier caractère (v) : argument sous forme d´un vecteur au lieu d´une listede scalaires.

15

SYNTAXE DES COMMANDES OPENGL 3/3

Cas de la commande glColor*()

Chaque commande OpenGL a une documentation associée accessible en lignehttp://www.opengl.org/developers/documentation/specs.html

Lorsqu'on nomme une commande typée, on omet les lettres de typage en lesremplaçant par une *.

par exemple glColor* désigne glColor3b, glColor3d, glColor3f, glColor3i, glColor3s,glColor3ub,glColor3ui, glColor3us, glColor4b, glColor4d, glColor4f,glColor4i, glColor4s, glColor4ub, glColor4ui,

glColor4us, glColor3bv,

glColor3dv, glColor3fv, glColor3iv, glColor3sv, glColor3ubv,glColor3uiv, glColor3usv, glColor4bv,

glColor4dv, glColor4fv,glColor4iv, glColor4sv, glColor4ubv, glColor4uiv, glColor4usv

Trois exemples: On a la même sélection de couleur (le blanc opaque) avec :

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

16

Page 5: Cours-4-5-6 (1).pdf

Cours-4-5-6.ps

Page 5

PRIMITIVES 1/3

Tracé de primitives géométriques

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

17

PRIMITIVES 2/3

Primitives disponibles

Les primitives suivantes sont disponibles aux programmeurs en OpenGL.

18

PRIMITIVES 3/3

Tracé d´une primitive géométrique

Toute primitive se trace au moyen d´une suite de sommets donnés par glVertex et situés entre un glBegin() et un glEnd().

// 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 d´une primitive n´a lieu que lors de la rencontre d´unecommande glFlush()

19

VARIABLES D'ÉTAT 1/6

Tracé de primitives géométriques

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

20

Page 6: Cours-4-5-6 (1).pdf

Cours-4-5-6.ps

Page 6

VARIABLES D'ÉTAT 2/6

Variables d´état

Le tracé graphique est affecté par la valeur des variables d´état qui consituentl'environnement graphique courant.

Variables de mode

Il existe deux modes d´ombrage définies par la commande glShadeModel quimodifie la variable d´état de mode GL_SHADE_MODEL :

� glShadeModel(GL_SMOOTH) : ombrage doux,

� glShadeModel(GL_FLAT) : ombrage plat (la valeur par défaut).

21

VARIABLES D'ÉTAT 3/6

Variables booléennes

Les variables booléennes sont activées et désactivées au moyen des commandesglEnable() et glDisable().

� GL_POINT_SMOOTH : tracé des points avec le filtrage correct ou antialiasés,

� GL_LINE_SMOOTH : tracé des droites avec le filtrage correct ou antialiasés,

� GL_LINE_STIPPLE : tracé en pointillés pour les droites.

Exemple

// Dessine les points filtrés

// Exemple en haut à droite

glEnable(GL_POINT_SMOOTH);

22

VARIABLES D'ÉTAT 4/6

Variables d´état valuées

Des commandes spécifiques permettent de changer leur valeur.

Leur valeur est accessible au moyen des commandes glGetBooleanv(),glGetDoublev(), glGetFloatv(), ou glGetIntegerv().

Exemple : la couleur

glColor3f(0.0, 0.0, 0.0); Noir

glColor3f(1.0, 0.0, 0.0); Rouge

glColor3f(0.0, 1.0, 0.0); Vert

glColor3f(0.0, 0.0, 1.0); Bleu

glColor3f(1.0, 1.0, 0.0); Jaune

glColor3f(0.0, 1.0, 1.0); Cyan

glColor3f(1.0, 0.0, 1.0); Magenta

glColor3f(1.0, 1.0, 1.0); Blanc

23

VARIABLES D'ÉTAT 5/6

Variables d´état valuées (suite)

Autres variables valuées

� Taille des points : glPointSize(GLfloat taille) où taille est la taille enpixel souhaitée pour le tracé des points.

� Largeur des lignes : glLineWidth(GLfloat largeur) où largeur est lalargeur en pixel souhaitée pour le tracé des lignes.

� Lignes pointillées : glLineStipple(GLint facteur, GLushort patron) oùpatron est une série de 16 bits à 0 (pas de tracé) ou 1 (tracé).Ce patron est répété autant que nécessaire pour le tracé d´une ligne. Le paramètre facteur, entre 0 and 255, est un coefficient de dilatation dupatron.GL_LINE_STIPPLE doit être activé par glEnable(GL_LINE_STIPPLE).

24

Page 7: Cours-4-5-6 (1).pdf

Cours-4-5-6.ps

Page 7

VARIABLES D'ÉTAT 6/6

Variables d´état valuées (fin)

Exemple de ligne pointillée

// Active le pointillé

glEnable(GL_LINE_STIPPLE);

// Définit le patron de pointillés 1 1 1 1 0 0 0 0 0 0 1 1 0 0 0 0

glLineStipple(2, 0x0C0F);

glBegin(GL_LINES);

glVertex2f(-2.0, 0.0);

glVertex2f(2.0, 0.0);

glEnd();

25

TRANSFORMATIONS GÉOMÉTRIQUES 1/6

Transformations géométriques (translation, rotation et changement d´échelle)

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

26

TRANSFORMATIONS GÉOMÉTRIQUES 2/6

Variable d´état : Mode de transformation

La commande glMatrixMode(GLenum mode) sert à changer la valeur de lavariable d´état GL_MATRIX_MODE.

Trois valeurs possibles GL_MODELVIEW, GL_PROJECTION, et GL_TEXTURE.

Composition des transformations

Lorsque glMatrixMode() est appelée, toutes les transformations suivantesaffectent la matrice de ce mode en se composant les unes aux autres.

Dans la suite, nous ne considérons que les compositions de transformations sur lamatrice de modèle de vue.

27

TRANSFORMATIONS GÉOMÉTRIQUES 3/6

Translation

La commande glLoadIdentity() sert à réinitialiser la matrice courante à lamatrice identité.

La commande glTranslate(TYPE x, TYPE y, TYPE z) multiplie la matricecourante par une matrice qui déplace un objet de (x, y, z)

(ou qui, en d´autres termes, déplace l´origine du même vecteur).

// Réinitialisation de la matrice de modèle 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 8: Cours-4-5-6 (1).pdf

Cours-4-5-6.ps

Page 8

TRANSFORMATIONS GÉOMÉTRIQUES 4/6

Rotation

La commande glRotate(TYPE angle, TYPE x, TYPE y, TYPE z) multiplie lamatrice 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)(ou qui, en d´autres termes, fait tourner le repère du même angle autour du même axe).

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

glColor3f(0.0, 1.0, 0.0); glTranslatef(0, 1.5, 0);

triangleContour();

// rotation de 30 degrés autour de Oz dans le repère translaté de (0, 1.5, 0)

// (donc centré au milieu de l'hypothénuse) -> triangle bleu

glColor3f(0.0, 0.0, 1.0); glRotatef(30, 0, 0, 1);

triangle();

29

TRANSFORMATIONS GÉOMÉTRIQUES 5/6

Changement d´échelle

La commande glScale(TYPE x, TYPE y, TYPE z) multiplie la matricecourante par une matrice qui fait trois homothéties selon les trois axes du

repère de rapports (x, y, z)(ou qui, en d´autres termes, multiplient les vecteurs unitaires des mêmes rapports).

Attention, si un des paramètres du changement d´échelle est nul, cette dimension est perdue jusqu´au 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 d´échelle de 1/2 sur chaque axe dans le repère translaté de (-1.5, 0, 0)

// (donc centré au milieu de l'hypothénuse) -> triangle cyan

glColor3f(0.0, 1.0, 1.0); glScalef(.5, .5, .5); triangle();

30

TRANSFORMATIONS GÉOMÉTRIQUES 6/6

Changement d´échelle de rapport négatif : symtétrie

Un changement d´échelle négatif par rapport à un axe revient à une symétriepar rapport au plan perpendiculaire composée avec une homothétie de rapport positif.

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

glColor3f(1.0, 0.0, 1.0); glTranslatef(0, -1.5, 0); triangleContour();

// changement d´échelle de -1 sur Oy et 1 sur Ox et Oz

// (une symétrie par rapport à xOz)

// dans le repère translaté de (0, -1.5, 0)

// (donc centré au milieu de l'hypothénuse) -> triangle gris

glColor3f(0.5, 0.5, 0.5); glScalef(1, -1, 1); triangle();

31

TRANSFORMATIONS DE PORT DE VUE 1/2

Commande glViewport

La transformation de port de vue revient à choisir la taille du papier pour le tiraged´une photographie.

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

place le coin haut gauche du port de vue en (x, y) et lui donne pour taille(largeur, hauteur).

Cette commande est généralement utilisée en redimensionnement de la fenêtrepour conserver la totalité de l´image dans la fenêtre.

32

Page 9: Cours-4-5-6 (1).pdf

Cours-4-5-6.ps

Page 9

TRANSFORMATIONS DE PORT DE VUE 2/2

Distorsion

Si la transformation de port de vue n'est pas dans les mêmes proportions quele rectangle proche du volume de vue, l´image subit une distorsion.

33

PROJECTION ORTHOGRAPHIQUE 1/2

Le volume de vue dans une projection orthographique est un parallélépipèderectangle.

Propriété

Conserve le parallélisme quelle que soit l´orientation des droites.

Conserve les rapports de longueurs sur des droites parallèles.

Commande glOrtho

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

34

PROJECTION ORTHOGRAPHIQUE 2/2

Volume de vue en projection orthographique

35

PROJECTION EN PERSPECTIVE 1/2

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

Propriété

Ne conserve pas le parallélisme :des droites parallèles 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, GLdoublebottom, GLdouble top, GLdouble near, GLdouble far) définit - les dimensions du rectangle de clipping proche- les positions des rectangles de clipping proche et lointain sur Oz. Cesdistances doivent être positives.

36

Page 10: Cours-4-5-6 (1).pdf

Cours-4-5-6.ps

Page 10

PROJECTION EN PERSPECTIVE 2/2

Volume de vue en projection en perspective

37

DISPLAY LISTS 1/3

Tracé de cercles et ellipses optimisé par l´utilisation de Display lists

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

38

DISPLAY LISTS 2/3

Utilité des Display lists

Les display lists servent à enregistrer en mémoire des commandes qui serontexécutées ultérieurement dans cet ordre.

Pour des objets tracés plusieurs fois, elles permettent d´effectuer les calculs unefois pour toutes et ainsi optimiser les programmes. De plus, elles utilisent, surles cartes graphiques appropriées, des mécanismes d'accès mémoire (DMA)accélérant le rendu graphique.

Définition des Display lists

Les commandes glNewList(GLuint name, GLenum mode) et glEndList()définissent la display list d´identificateur name.

L'identificateur name est un entier unique. Il peut être généré par la commande glGenLists(GLuint nbListes).

GLuint displayList; displayList = glGenLists(1);

Deux modes sont possibles :

39

- GL_COMPILE les commandes sont compilées sans être exécutées,- GL_COMPILE_AND_EXECUTE les commandes sont compilées et exécutées.

DISPLAY LISTS 3/3

Exemple

Définition de la display list My_Circle

#define My_Circle 1

glNewList(My_Circle, GL_COMPILE);

glBegin(GL_POLYGON);

// Génère 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 définition d´un cercle

glEndList();

Invocation de la display list My_Circle

glCallList(My_Circle);

40

Page 11: Cours-4-5-6 (1).pdf

Cours-4-5-6.ps

Page 11

TRACÉ EN 3D 1/2

Tracé d'un cube

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

41

TRACÉ EN 3D 2/2

Instructions pour le masquage des parties cachés en 3D

L´effacement des parties cachées est géré dans OPenGL au moyen du Z-buffer.

Allocation du Z-buffer

À placer dans l´initialisation d´OpenGL.

glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH);

Variable d´état d´activation du Z-buffer

À placer dans l´initialisation d´OpenGL.

glEnable(GL_DEPTH_TEST);

Effacement du Z-buffer

À placer avant chaque dessin de la scène.

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

42

ANIMATION 1/7

Animation d'un cube par les touches + et -

Le programme src/opengl-anim1.c fait une animation d'un cube en rotation enappuyant sur les touches + et -.

Principe

Une animation est obtenue en modifiant progressivement les paramètres d´un affichage et en retraçant la figure après chaque modification.

En raison de la persistence rétinienne, l'observateur voit une scène enmouvement continu.

Dans le programme ci-dessus, l´angle de rotation du cube est modifié par l´appuisur les touches + et -.

43

ANIMATION 2/7

Instructions pour l'animation par double buffer

L´animation est gérée par deux buffers : - un buffer de tracé non visible (le buffer arrière) - un buffer visible (le buffer avant).

Une fois le nouveau tracé effectué, on permute les deux buffers au moyen de lacommande glutSwapBuffer() (librairie GLUT) après glFlush().

Allocation du double buffer À placer dans l´initialisation d´OpenGL.

glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);

Échange des deux buffers À placer après chaque dessin de la scène.

glutSwapBuffers();

Modification des valeurs du tracé

Après chaque modification des valeurs du tracé, il faut redemander un affichage

glutpostRedisplay();

44

Page 12: Cours-4-5-6 (1).pdf

Cours-4-5-6.ps

Page 12

ANIMATION 3/7

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

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

Définition d´une fonction de call-back d´attente

On définit une fonction de call-back d'attente qui est appelée dès que lesystème ne traite plus un autre événement ou un autre call-back.

glutIdleFunc(&window_idle);

Cette fonction incrémente l´angle de rotation et demande le réaffichage.

GLvoid window_idle()

{

angle++;

glutPostRedisplay();

}

45

ANIMATION 4/7

Animation automatique (suite)

Selon les machines, une même animation automatique s'exécutera plus oumoins vite si l'on ne contrôle pas le rythme de mise à jour.

Définition d'une vitesse maximale d'animation

On définit un intervalle minimal de rafraîchissment de 40ms.

void anime(int pas){

/* action à effectuer en fonction du numéro d'image */

if(pas == 2000) return;

/* redemande l'affichage */

glutPostRedisplay();

pas++;

/* rappellera la fonction d'animation anime dans 40 millisecondes au pus tôt */

glutTimerFunc( 40, anime, pas );

}

Attention, la fonction de call-back définie par glutTimerFunc n'est appeléequ'une seule fois. Le programme src/opengl-anim4.c propose une animationcontrôlée par un temps de latence de 40ms.

46

ANIMATION 5/7

Animation automatique (fin)

Quelques principes pour réussir une animation:

� temporiser les animations avec la fonction glutTimerFunc

� avoir une variable globale unique t pour le temps,

� lire le temps machine entre deux frames pour voir si le rythme de mise àjour est suffisant (au minimum 30 fps),

� prévoir des procédures d'optimisation en cas de charge trop forte (niveauxde détail, maillage adaptatif, remplacement d'objets par des imposteurs...).

47

ANIMATION 6/7

Animation d'un cube par déplacement de la souris

Le programme src/opengl-anim6.c fait une animation d'un cube par déplacementde la souris avec le bouton gauche enfoncé.

Définition d´une fonction de call-back de gestion des clicks souris (avant un déplacement)

glutMouseFunc(&window_mouseFunc);

On note le lieu où a lieu un click souris de sorte à gérer les mouvementsrelatifs de la souris lors de son déplacement.

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 13: Cours-4-5-6 (1).pdf

Cours-4-5-6.ps

Page 13

ANIMATION 7/7

Animation par déplacement de la souris (suite et fin)

Définition d´une fonction de call-back de gestion des déplacement de la souris

glutMotionFunc(&window_motionFunc);

Cette fonction modifie l´angle de rotation en fonction des déplacements relatifsde la souris et demande le réaffichage.

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

ÉCLAIREMENT 1/5

Éclairement d'une scène

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

50

ÉCLAIREMENT 2/5

Instructions pour définir un éclairement

L´éclairement requiert :- une ou plusieurs sources lumineuses,- des propriétés lumineuses sur les objets.

Source lumineuse

À placer dans l´initialisation d´OpenGL et définie par une position et unecouleur (blanc par défaut).

// Crée une source de lumière directionnelle

glLightfv(GL_LIGHT0, GL_POSITION, position);

glEnable(GL_LIGHTING);

glEnable(GL_LIGHT0);

Variable d´état d´ombrage doux (vs. plat)

À placer dans l´initialisation d´OpenGL.

// Définit un modèle d´ombrage

glShadeModel(GL_SMOOTH);

51

ÉCLAIREMENT 3/5

Instructions pour définir un éclairement (suite et fin)

Définition des caractéristiques lumineuses des objets (propriétés matérielles)

Par souci de simplicité, on donne comme propriété de lumière ambiante etdiffuse la couleur qui est définie par un appel à glColor().

// La variable d´état de couleur GL_AMBIENT_AND_DIFFUSE

// est définie par des appels à glColor

glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);

glEnable(GL_COLOR_MATERIAL);

Pour chaque objet, on définit les propriétés matérielles de la couleur spéculaireet du degré de brillance.

glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular);

glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, shininess);

52

Page 14: Cours-4-5-6 (1).pdf

Cours-4-5-6.ps

Page 14

ÉCLAIREMENT 4/5

Transparence en OpenGL

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

53

ÉCLAIREMENT 5/5

Définition de propriétés matérielles

Définition directe des propriétés matérielles avec une transparence

On donne quatre composantes: ambiente, diffuse, spéculaire et brillance.

Les trois premières sont définies par trois composantes de couleur et unetransparence.

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

GLfloat emeraldDiff[] = {0.07568, 0.61424, 0.07568, 0.5};

GLfloat emeraldSpec[] = {0.633, 0.727811, 0.633, 0.5};

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

54

TEXTURE 1/5

Texturage d'un objet

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

55

TEXTURAGE 2/5

Instructions pour définir un texturage

Le texturage requiert :- un bitmap décrivant l´image à plaquer sur les faces,- une association entre les sommets d´un polygone et les coordonnéesde la texture (délimitée par un rectangle [0,1]x[0,1]).

Bitmap de la texture

On peut la charger au moyen de la libjpeg à partir d´un fichier jpeg.Utiliser pour cela les fichiers fournis texjpeg.c et texjpeg.h.

CreateTexture(g_Texture, "chaton.jpg");

Variable d´état de texturage

À placer dans l´initialisation d´OpenGL.

glEnable(GL_TEXTURE_2D);

56

Page 15: Cours-4-5-6 (1).pdf

Cours-4-5-6.ps

Page 15

TEXTURAGE 3/5

Instructions pour définir un texturage (suite et fin)

Paramètres du texturage

Définissent le mode d'application des textures.

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,

GL_LINEAR);

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL ou GL_BLEND);

Application du texturage

Définissent l´ancrage de la texture sur le polygone lors du tracé.

glBegin(GL_POLYGON);

glTexCoord2f( 0.0 , 1.0 ); glVertex3f(0, 0, 0);

glTexCoord2f( 1.0 , 1.0 ); glVertex3f(1, 0, 0);

glTexCoord2f( 1.0 , 0.0 ); glVertex3f(1, 1, 0);

glTexCoord2f( 0.0 , 0.0 ); glVertex3f(0, 1, 0);

glEnd();

57

TEXTURE 4/5

Superpositions de textures transparentes

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

58

TEXTURAGE 5/5

Texturage avec transparence

Chargement des textures

Les fichiers de textures contenant une composante alpha, on doit utiliser unformat qui l'accepte.On peut les charger au moyen de la libpng à partir d´un fichier png.Utiliser pour cela les fichiers fournis texpng.c et texpng.h.

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 l´initialisation d´OpenGL.

glEnable(GL_BLEND);

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

59

Éléments de géométrie dans l'espace

60

Page 16: Cours-4-5-6 (1).pdf

Cours-4-5-6.ps

Page 16

PRODUIT VECTORIEL 1/3

Formule

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

Calcul et représentation

61

PRODUIT VECTORIEL 2/3

Propriétés algébriques

Vecteurs unitairesi x j = kj x k = ik x i = j

Antisymétrieb x a = -(a x b)

Linéaritéa x (b + c) = a x b + a x c

Homogénéiték . (a x b) = (k . a) x b

62

PRODUIT VECTORIEL 3/3

Propriétés géométriques

� Le produit vectoriel est nul si et seulement si les deux vecteurs sontlinéairement dépendants (colinéaires).

� (a x b) est orthogonal à a et b.

� 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 donnée par la règle des trois doigts de lamain droite.

� Application immédiate : recherche de la normale à un plan.

63

COORDONNÉES HOMOGÈNES EN 3D

Définition

On passe des coordonnées cartésiennes aux coordonnées homogènes enajoutant une quatrième coordonnée. 1 pour les points. 0 pour les vecteurs

Dans le sens inverse, il faut ramener la quatrième coordonnée du point à 1 parproportionnalité avant de la supprimer.

Opérations sur les points et vecteurs en 3D

� La différence 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.

64

Page 17: Cours-4-5-6 (1).pdf

Cours-4-5-6.ps

Page 17

COMBINAISONS AFFINES DE POINTS EN 3D

Définition

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

Le point M, combinaison affine de n points M1...Mn, appartient à l´enveloppe

convexe des points M1...Mn si et seulement si

0 <= xi <= 1 pour tout i

65

ÉQUATIONS PARAMÉTRIQUES DE PLANS

Équation paramétrique

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

66

ÉQUATIONS NORMALES DE PLANS

Équation normale ou implicite

Soit n un vecteur normal et A un point du plan, l'équation normale est donnéepar :AM . n = 0 <=> (x - xA) . xn + (y - yA) . yn + (z - zA) . zn = 0

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

� a pour vecteur normal n( a, b , c ),� d = n . (A - O).

67

MORCEAUX DE PLANS

Définition

M(s, t) = A + s u + t vavec des valeurs bornées pour s et t, afin de ne parcourir qu'un parallélogramme.

Si 0 <= s <= 1 et 0 <= t <= 1 et 0 <= s + t <= 1, alors M se trouveà l´intérieur du triangle ABC

68

Page 18: Cours-4-5-6 (1).pdf

Cours-4-5-6.ps

Page 18

GÉOMÉTRIE CONSTRUCTIVE DES SOLIDES: BUTS

Buts

Construire des solides complexes à partir d´opérations élémentaires sur dessolides élémentaires.

� limiter les librairies d´objets géométriques élémentaires,

� fournir des mécanismes opératoires pour la constructions des solides paragglomération, intersection ou extrusion,

� fournir un mécanismes récursif de construction d´objets permettant lacréation de librairies.

69

GÉOMÉTRIE CONSTRUCTIVE DES SOLIDES:OPÉRATIONS DE BASE

Définitions

S = S1 Oper S2

Union:

Le solide S est la réunion des deux solides S1 et S2. Les frontières sont conservées.

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 réunion des deux solides S1 et S2. Les frontières incluses sont effacées.

70

GÉOMÉTRIE CONSTRUCTIVE DES SOLIDES:EXEMPLE (1/3)

Modélisation d´une bobine

Solide construit à partir de volumes élémentaires

71

GÉOMÉTRIE CONSTRUCTIVE DES SOLIDES:EXEMPLE (2/3)

Visualisation avec POVray

72

Page 19: Cours-4-5-6 (1).pdf

Cours-4-5-6.ps

Page 19

GÉOMÉTRIE CONSTRUCTIVE DES SOLIDES:EXEMPLE (3/3)

Définition en POVrayintersection {

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 }

}

// 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

Éléments de transformations dans l'espace

74

TRANSFORMATION AFFINE EN COORDONNÉESHOMOGÈNES 1/2

Forme générale

La matrice d'une transformation affine est une matrice 4x4 qui conserve laquatrième coordonnée :

75

TRANSFORMATION AFFINE EN COORDONNÉESHOMOGÈNES 2/2

Trois exemples

76

Page 20: Cours-4-5-6 (1).pdf

Cours-4-5-6.ps

Page 20

INVERSE D'UNE TRANSFORMATION AFFINE 1/3

Une matrice est inversible si et seulement si son déterminant est non nul.

Déterminant d'une matrice 3x3

77

INVERSE D'UNE TRANSFORMATION AFFINE 2/3

Calcul de la matrice inverse d'une matrice 3x3

On calcule la transposée de la matrice des cofacteurs et on la divise par ledéterminant de la matrice.

78

INVERSE D'UNE TRANSFORMATION AFFINE 3/3

Exemples

Translation

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

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 parallèle à Oy de rapport f est un glissementparallèle à Oy de rapport -f.

79

ROTATIONS 1/12

Les trois rotations autour des axes

Les trois rotations de base autour des axes sont des rotations dans le sensinverse des aiguilles d'une montre lorsqu'on regarde vers les coordonnéesnégatives.

80

Page 21: Cours-4-5-6 (1).pdf

Cours-4-5-6.ps

Page 21

ROTATIONS 2/12

Matrices des rotations de base autour des axes

La matrice de la rotation autour de Oy semble différente.Elle ne l'est pas si l'on considère une permutation cyclique des axes Ox, Oy et Oz.

81

ROTATIONS 3/12

Compositions de rotations autour des axes

� Les rotations autour des axes ne commutent pas.

� Forme générale d'une composition de rotations autour des axes :M = Rz(t3) . Ry(t2) . Rx(t1). t1, t2 et t3 sont appelés les angles d'Euler.

82

ROTATIONS 4/12

Rotation autour d'un axe quelconque

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

83

ROTATIONS 5/12

Factorisation d'une rotation

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

Rz autour des axes du repère.

On résoud l'égalité suivante :

Si on laisse de côté les cas particuliers :

84

Page 22: Cours-4-5-6 (1).pdf

Cours-4-5-6.ps

Page 22

ROTATIONS 6/12

Quaternions

Définition: q = w + xi + yj +zk

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).

Norme: N(q) = ww + xx + yy + zz

Conjugué: q* = w - xi - yj - zk

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

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

En informatique graphique on ne considère que des quaternions unitaires, lesseuls encodant des rotations.

85

ROTATIONS 7/12

Quaternion associé à une rotation

Propriété: Un quaternion unitaire q = cos + û sin � � représente représente larotation d'un angle 2 � autour de l'axe û

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*

Produit de quaternions et composition de rotations

La rotation par la composée de deux rotations R1 et R2, associées aux quaternions

q1 et q2, est la rotation associée au quaternion q1 q2.

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

86

ROTATIONS 8/12

Matrice de rotation associée à un quaternion

On utilise les formules R = I + S sin + S� 2 (1 - cos )� et q = cos + û sin � �

Pour en déduire la matrice de rotation en fonction des composantes w, x, y, z d'unquaterion unitaire.

87

ROTATIONS 9/12

Exemple de quaternions

Symétries par rapport aux axes x, y, z

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

� Ry, � = (0, (0, 1, 0))

� Rz, � = (0, (0, 0, 1))

Rz, � ( Ry, � )

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

88

Page 23: Cours-4-5-6 (1).pdf

Cours-4-5-6.ps

Page 23

ROTATIONS 10/12

Avantage des quaternions par rapport aux rotations: interpolation

Les quaternions s'interpolent facilement et permettent donc de définir desanimations sur des rotations à partir de positions clés.

Pour qu'une interpolation entre des quaternions soit correcte, il faut qu'elle sefasse sur la sphère unité.

L'interpolation de 2 quaternions q1 et q2 revient à chercher l'arc de longueur

minimale sur la sphère unité et à le parcourir à vitesse angulaire constante:Spherical Linear Interpolation, SLERP.

89

ROTATIONS 11/12

Interpolation SLERP entre deux quaternions

Problème: soit deux quaternions q1 et q2, on cherche à interpoler ces deux

quaternions sur la sphère unitaire en parcourant le grand cercle qui les joint.

90

ROTATIONS 12/12

Interpolation SLERP entre deux quaternions (suite)

Solution: la solution suivante

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

vérifie

� 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) = q2

t . q1(1-t)

q(t) = (cos t�2 + û2 sin t�2) (cos (1-t)�1 + û1 sin (1-t)�1)

91

CHANGEMENT DE REPÈRE

Calcul des nouvelles coordonnées

. soit deux repères R et R',

. soit M la matrice de la transformation T telle que T(R)=R'

. soit (x, y, z, 1 ) les coordonnées de P dans (R),

. soit (x', y', z', 1 ) les coordonnées de P dans (R'),

Se généralise à un enchaînement de changements de repères M1, M2, M3.

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

92

Page 24: Cours-4-5-6 (1).pdf

Cours-4-5-6.ps

Page 24

TRANSFORMATION FENÊTRE À PORT DE VUE 1/2

Finalité

Transformer une fenêtre dans les coordonnées du monde vers un port devue dans les coordonnées de l'écran.

93

TRANSFORMATION FENÊTRE À PORT DE VUE 2/2

Matrice de la transformation résultante

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

xmin, -ymin)

La transformation précédente doit être composée avec un clipping sur lafenêtre dans les coordonnées du monde pour n'afficher que les partiespertinentes de la figure.

94

VISUALISATION 3D

Modèle conceptuel de la visualisation 3D

Afficher sur un plan une scène complexe en 3 dimensions.

Deux types principaux de projections.

� en perspective : selon un centre de projection, � parallèle : selon une direction de projection.

95

PROJECTION EN PERSPECTIVE 1/7

Définition

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

Une projection en perspective dont le centre de projection est à l'infini est uneprojection parallèle.

96

Page 25: Cours-4-5-6 (1).pdf

Cours-4-5-6.ps

Page 25

PROJECTION EN PERSPECTIVE 2/7

Point de fuite

Si une droite D coupe le plan de projection, il existe un point F, appelé point de fuite appartenant à la projection de toutedroite parallèle à D.

On différencie les projections en perspective par le nombre de points de fuite pourles directions des axes du repère(le nombre d'intersections des axes de coordonnées avec le plan).

� en général deux points de fuite (caméra verticale non parallèle à un desaxes),

� le troisième point de fuite n'augmente pas significativement le réalisme.

97

PROJECTION EN PERSPECTIVE 3/7

Propriétés géométriques des projections en perspective

� Les projections ne conservent pas le parallélisme des droites non parallèles auplan de projection.

� La taille d'un objet est inversement proportionnelle à sa distance au point deprojection :|p(M) p(M')| = d0 . 1/d . |MM'|

98

PROJECTION EN PERSPECTIVE 4/7

Calcul des coordonnées projetées en perspective

On se place dans le cas d'une projection canonique : Centre de projection à l'origine et plan de projection parallèle à xOy.

Coordonnées dans le plan de projection

99

PROJECTION EN PERSPECTIVE 5/7

Calcul de la profondeur dans une projection en perspective

Pseudo-profondeur

On conserve une valeur de la profondeur telle que deux points ayant la mêmeprojection soient distingables.

On utilise une fonction homogène 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 arrière du volume de vue coplanaires avec lesfaces du volume de vue canonique.)

a = -(far + near) / (far - near) et b = -2 (far . near) / (far - near)

100

Page 26: Cours-4-5-6 (1).pdf

Cours-4-5-6.ps

Page 26

PROJECTION EN PERSPECTIVE 6/7

Matrice d'une projection en perspective en coordonnées homogènes

Se déduit des résultats des deux transparents précédents

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

101

PROJECTION EN PERSPECTIVE 7/7

Trois exemples de projections en perspective

Projection sur un des plans du repère d'un cube dont les arêtes sontparallèles aux axes du repère

� avec un seul point de fuite (1), � cube plein avec deux points de fuite (2) � et cube plein avec trois points de fuite (3).

102

PROJECTION PARALLÈLE 1/5

Définition

L'image d'un point M par une projection parallèle sur le plan P d'axe D estl'intersection de la droite parallèle à D passant par M avec le plan P.

103

PROJECTION PARALLÈLE 2/5

Deux types de projections parallèles

� projection orthographique lorsque la direction de projection estperpendiculaire au plan de projection,

� projection oblique sinon.

Propriétés géométriques des projections parallèles

� Les projections parallèles conservent le parallélisme des droites.

� Les projections parallèles conservent les rapports des distances selon unedirection donnée.

104

Page 27: Cours-4-5-6 (1).pdf

Cours-4-5-6.ps

Page 27

PROJECTION PARALLÈLE 3/5

Quelques projections orthographiques

Projections selon les axes

Vues de face, de profil et de dessus.

Angles et distances dans les plans parallèles aux plans du repère sontconservés.

105

PROJECTION PARALLÈLE 4/5

Quelques projections orthographiques (suite)

Projections axonométriques

selon un plan qui coupe les axes. Les distances sont modifiées dans un rapport constant sur chaque axe.

� Si le plan de projection fait le même angle avec les trois axes, il s'agitd'une projection isométrique. Le rapport des distances est le même pour les 3 axes.

106

PROJECTION PARALLÈLE 5/5

Projection cavalière

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

� Les longueurs sont conservées sur les trois axes.

107

VOLUME DE VUE 1/2

Volume de vue en projection orthographique

Volume de vue canonique : projection parallèle à Oz en regardant vers les znégatifs.

Pour se ramener à un volume de vue canonique, on effectue une rotation durepère.

108

Page 28: Cours-4-5-6 (1).pdf

Cours-4-5-6.ps

Page 28

VOLUME DE VUE 2/2

Volume de vue en projection en perspective

Volume de vue canonique : les faces proche et lointaine du tronc de pyramidesont parallèles à xOy.La caméra est en O.

Pour se ramener à un volume de vue canonique, on effectue une rotation et une translationdu repère.

109

MATRICE D'UNE PROJECTION 1/6

Matrice en coordonnées homogènes de la projection orthographiquecanonique

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

110

MATRICE D'UNE PROJECTION 2/6

Coordonnées en perspective canonique

Coordonnées du point projeté en fonction de celles du point source

(x'M, y'M, z'M) = (xM / (zM / near), yM / (zM / near), near)

111

MATRICE D'UNE PROJECTION 3/6

Matrice en coordonnées homogènes de la perspective canonique de centreO

(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 29: Cours-4-5-6 (1).pdf

Cours-4-5-6.ps

Page 29

MATRICE D'UNE PROJECTION 4/6

Projection en perspective de centre quelconque

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

La valeur de t est trouvée par les équations sur z :l'ordonnée z'M de p(M) est égale à near.

113

MATRICE D'UNE PROJECTION 5/6

Matrice en coordonnées homogènes de la perspective de centre quelconque

114

MATRICE D'UNE PROJECTION 6/6

Spécialisations de la matrice de perspective

La matrice se spécialise en des matrices de projections particulières en utilisantles valeurs suivantes

near

Q dx dy dz

Proj orthogonale 0 infini

0 0 -1

Perspective centreO

near near 0 0 -1

Perspectivecavalière 0

infini cos a sin a -1

115

PROJECTION EN OPENGL 1/5

Définition d'une projection orthographique en openGL via glOrtho

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

116

Page 30: Cours-4-5-6 (1).pdf

Cours-4-5-6.ps

Page 30

PROJECTION EN OPENGL 2/5

Définition d'une projection en perspective en openGL via glFrustum

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

117

PROJECTION EN OPENGL 3/5

Transformation vers le volume de vue canonique

On veut ramener le tronc de pyramide de glFrustum au volume de vuecanonique qui s'étend de -1 à 1 dans les trois directions.

1.La transformation selon Oz a déjà été traitée lors de la définition d'uneperspective 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

118

PROJECTION EN OPENGL 4/5

Transformation vers le volume de vue canonique

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

La matrice MPz est donnée au transparent Projection en perspective 6/7.

119

PROJECTION EN OPENGL 5/5

Matrice de projection sur le volume de vue canonique

La composition des trois matrices précédentes est donc une projection sur laface z = -1 dans le volume de vue canonique (x, y et z appartiennent à [-1, 1]).

Clipping, calcul des faces cachées, transformation vers le port de vue ettransformations géométriques sont simplifiées par ce qu'elles opèrent sur levolume canonique.

120

Page 31: Cours-4-5-6 (1).pdf

Cours-4-5-6.ps

Page 31

Notion de graphe de scène

121

INTRODUCTION

Les graphes de scènes

Les graphes de scènes sont des modèles de descriptions de scènes complexestrès utilisés en réalité virtuelle.Ils sont modélisés par plusieurs langages, nous nous contenterons de considérerles primitives d'OpenGL (graphes de scènes procéduraux) et Java3D (graphes descènes en modèle objet).

Ce cours reprend en partie les présentations faites sur ce thème àSIGGRAPH'2000. Je remercie Sherif Ghali (Max Plank Institute) et Henri A. Sowizral(Sun Microsystems Inc.) pour avoir mis ces présentations à disposition.

122

EXEMPLE DE GRAPHE DE SCÈNE 1/3

La description d'une grue par un graphe de scène

La grue se compose :

1.d'une cabine : un cube centré à l'origine dont les arêtes sont alignées sur lesaxes,

2.un bras B1 articulé sur la cabine : un segment aligné sur l'axe des abscisses

dont une des extrémités est l'origine,

3.un bras B2 articulé sur le bras B1 : un segment aligné sur l'axe des abscisses

dont une des extrémités est l'origine.

La solidarité entre les pièces mécaniques fournit un structuration implicitepour la description de la grue par un graphe de scène.

123

EXEMPLE DE GRAPHE DE SCÈNE 2/3

124

Page 32: Cours-4-5-6 (1).pdf

Cours-4-5-6.ps

Page 32

EXEMPLE DE GRAPHE DE SCÈNE 3/3

Avantages d'une représentation hiérarchique en animation

� Toute transformation sur une des pièces se répercute sur l'ensembledes pièces qui en sont solidaires :un mouvement de la cabine, va entraîner un mouvement correspondant desdeux bras.

� Tous les tracés se font dans le repère canonique :or de nombreuses librairies fournissent des primitives dont la position sedéfinit par rapport au repère canonique.

La structuration combine des impératifs géométriques, fonctionnels etgraphiques.

125

CAS GÉNÉRAL

Forme générale d'un graphe de scène

Les feuilles sont des objets graphiques et les noeuds intermédiaires destransformations.

126

STRUCTURES DE GRAPHE DE SCÈNE 1/2

Deux structures principales pour les graphes de scènes

� Les arbres : chaque noeud n'a qu'un seul ancêtre, la transformation résultante s'obtient par composition des transformations surle chemin menant de la racine au noeud courant.

� Les graphes acycliques orientés : permettent de partager des objetsgéométriques ou des sous-scènes sans les redécrire,chaque chemin de la racine au noeud courant fournit une transformationpermettant de générer une des sous-scènes décrite par ce noeud.

127

STRUCTURES DE GRAPHE DE SCÈNE 2/2

Arbres ou Graphes acycliques orientés pour les graphes de scènes

128

Page 33: Cours-4-5-6 (1).pdf

Cours-4-5-6.ps

Page 33

IMPLÉMENTATIONS DES GRAPHES DE SCÈNE

Implémentation procédurale

� L'arbre de scène est parcouru dynamiquement par des appels successifs detransformations puis de primitives graphiques.

� Des instructions de sauvegarde et restauration du contexte graphiquepermettent une descente dans l'arbre avec rétablissement des conditionsd'appel.

Implémentation orientée objet

� L'arbre de scène est défini statiquement comme une structure de donnéehiérarchique avec un mécanisme d'héritage.

� Le visualiseur de ces données analyse et parcourt la structure dedonnées graphiques et génère les images en s'appuyant sur une librairiegraphique.

129

IMPLÉMENTATION PROCÉDURALE 1/7

130

IMPLÉMENTATION PROCÉDURALE 2/7

131

IMPLÉMENTATION PROCÉDURALE 3/7

132

Page 34: Cours-4-5-6 (1).pdf

Cours-4-5-6.ps

Page 34

IMPLÉMENTATION PROCÉDURALE 4/7

133

IMPLÉMENTATION PROCÉDURALE 5/7

134

IMPLÉMENTATION PROCÉDURALE 6/7

135

IMPLÉMENTATION PROCÉDURALE 7/7

136

Page 35: Cours-4-5-6 (1).pdf

Cours-4-5-6.ps

Page 35

IMPLÉMENTATION ORIENTÉE OBJETS 1/3

137

IMPLÉMENTATION ORIENTÉE OBJETS 2/3

138

IMPLÉMENTATION ORIENTÉE OBJETS 3/3

139

HÉRITAGE DANS LES GRAPHES DE SCÈNE J3D 1/3

Structure générale d'un arbre de scène en Java3D

� Virutal Universe : base d'un graphe de scène,

� High resolution locale : une origine pour les branch groups qui endépendent,

� Branch group node : la racine d'un sous-graphe appelé branch graph, lesseuls noeuds à pouvoir être attachés à un locale,

� Group node : les noeuds qui architecturent la scène graphique et sesrelations d'héritage,

� Leaf node : les noeuds qui définissent les entités atomiques telles que lesprimitives géométriques, les lumières et les sons.

� View platform object : vue de l'utilisateur au sein de l'univers virtuel.

140

Page 36: Cours-4-5-6 (1).pdf

Cours-4-5-6.ps

Page 36

HÉRITAGE DANS LES GRAPHES DE SCÈNE J3D 2/3

141

HÉRITAGE DANS LES GRAPHES DE SCÈNE J3D 3/3

142

Collisions et Intersections

143

COLLISIONS ET INTERSECTIONS: INTRODUCTION

Introduction

Méthodes rapides pour trouver les contacts/intersections entre volumesmodifier la scène en conséquence: changements de trajectoires,

déformations.

� La recherche systématique des intersections entres des triangles de maillagesest lourde et inopérante.

� Dans des scènes animées, l'oeil est assez tolérant aux approximations sur lagestion des collisions.

On va donc effectuer des simplifications et des optimisations pour que lagestion des intersections et des collisions soit compatible avec un rendu tempsréeel.

144

Page 37: Cours-4-5-6 (1).pdf

Cours-4-5-6.ps

Page 37

COLLISIONS ET INTERSECTIONS: APPLICATIONS

Applications du calcul des intersections

� Évitement d'obstacles (réalité virtuelle, réalité augmentée, jeux,robotique...)

� Saisie d'objets (télémédecine, télémaintenance, formation...)

� Tracé par lancer de rayon: rendu photo-réaliste

� Pointage (souris, wand...)

Applications de la gestion des collisions

� Simulation de systèmes physiques (jeux, simulation scientifique, effetsspéciaux et animation...)

145

COLLISIONS ET INTERSECTIONS: EXEMPLE

Exemples d'effets spéciaux générés en informatique graphique

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

146

COLLISIONS ET INTERSECTIONS: MÉTHODES

Méthodes

� Volumes englobants: simplification de la géométrie et éventuellementhiérarchisation

� Cohérence spatiale: régularité géométrique et connexité des volumes...

� Cohérence temporelle: régularité géométrique et connexité destrajectoires...

147

COLLISIONS: ÉTAPES

Étapes de calcul des collisions

� Détection de collision: réponse booléenne sur la possibilité de collisionentre deux objets

� Détermination de collision: localisation précise de la collision

� Réponse: modifications cinématiques et déformations géométriques

148

Page 38: Cours-4-5-6 (1).pdf

Cours-4-5-6.ps

Page 38

COLLISIONS: ARBRES BINAIRES DE PARTITION 1

Collision d'un point avec un polyèdre

On construit l'arbre binaire de partition de l'espace (BSP) associé au polyèdre (voircours Suppression de parties cachées).

On complète l'arbre par des feuilles "vide" ou "solide".

Pour tout segment O1O2, on peut:

� déterminer les objets avec lesquels il y a collision

� les lieux de collisions sur le segment O1O2.

149

COLLISIONS: ARBRES BINAIRES DE PARTITION 2

Collision d'un point avec un polyèdre

150

COLLISIONS: AUGMENTATION DU VOLUME 1

Collision d'une sphère (ou d'un cylindre) avec un polyèdre

Pour gérer les collisions d'un objet non ponctuel, on se ramène à une intersection avec un objet ponctuel en créant un volumeaugmenté simplifié.

� Le volume augmenté exact est obtenu en prenant l'enveloppe de l'objetpour toutes les positions où il est en contact avec le volume.

� On simplifie en translatant les plans initiaux et en ajoutant des plans debiseau.

151

COLLISIONS: AUGMENTATION DU VOLUME 2

Calcul du volume augmenté

O1 est une sphère (on raisonne en 3 dimensions) ou un cylindre (on raisonne en

deux dimensions).

152

Page 39: Cours-4-5-6 (1).pdf

Cours-4-5-6.ps

Page 39

COLLISIONS: RÉPONSE 1

Réponse à une collision

On considère deux particules P1 et P2, de vitesses v1 et v2 entrant en collision.

La réponse à une collision est le calcul de la trajectoire des objets après unecollision.

Simplification: on ne tient pas compte des vitesses angulaires.

Notions

La quantité de mouvement:

M = m v

L'impulsion sur une particule est sa variation de quantité de mouvement:

I = M = m v� � [1]

153

COLLISIONS: RÉPONSE 2

Impulsions dans un choc

Lors d'une collision entre 2 corps, les impulsions sont égales et opposées, comptetenu de la 3e loi de Newton.

Simplification: on suppose que les forces de frictions sont négligeables dans lechoc, les impulsions sont donc portées par n, la normale à la surface de contact.

I1 = m1 (v'1 - v1) = j n = -I2 = -m2 (v'2 - v2) [2]

154

COLLISIONS: RÉPONSE 3

Élasticité d'un choc

Le coefficient de restitution mesure la perte d'énergie cinétique dans la collision.

Notation: le coeffcient de restitution est égal au rapport des vitesses relativesavant et après la collision.

(v'1 - v'2) = e(v1 - v2) [3]

� Dans un choc parfaitement élastique (e=1), les vitesses relatives sontconservées.

� Dans un choc complètement inélastique (e=0), les vitesses relatives finalessont nulles.

155

COLLISIONS: RÉPONSE 4Calcul de j et des vitesses finales

On calcule [3] pour les vitesses normales, on remplace par les valeurs de v'1 - v'2 trouvées

dans [2] et on en déduit j et les vitesses finales:

[4]

Cas particulier: choc parfaitement élastique contre un mur

On considère que la masse du mur est infinie et on obtient

[5]

156

Page 40: Cours-4-5-6 (1).pdf

Cours-4-5-6.ps

Page 40

COLLISIONS: RÉPONSE 5

Cas particulier: choc parfaitement élastique de deux projectiles

[6]

157

COLLISIONS: RÉPONSE 6

Cas de deux projectiles de mêmes masses

[7]

158

INTERSECTIONS: VOLUMES ENGLOBANTS -INTRODUCTION

Utilité et typologie des volumes englobants

Pour accélérer et simplifier les recherches d'intersections, on crée des volumes englobants qui sont supposés contenir tout le volumeinitial

On examinera les volumes englobants suivants:

� Polyèdres (boîtes): parallélépipèdes rectangles alignés ou non sur les axeset polyèdres à faces opposées parallèles (k-DOP).

� Sphères et cylindres.

On détaillera les intersections suivantes:

� Droite/sphère et droite/boîte: utiles en sélection d'objets.

� Boîte/boîte: gestion des collisions entre objets.

159

INTERSECTIONS: VOLUMES ENGLOBANTS -HIÉRARCHIE

Hiérarchie volumes englobants

Pour accélérer la recherche d'intersections, on organise les volumes englobants en hiérarchie au moyen d'arbres n-aires.

À chaque niveau un noeud contient l'ensemble de ses descendants.

160

Page 41: Cours-4-5-6 (1).pdf

Cours-4-5-6.ps

Page 41

INTERSECTIONS: VOLUMES ENGLOBANTS -HIÉRARCHIE

Trois modes de construction

Méthode ascendante bottom-up

combine des primitives sur des critères de proximité Méthode descendante top-down

part d'un volume englobant maximal puis subdivision récursive: recherche d'unaxe de subdivision et d'un lieu de subdivision sur cet axe

Insertion incrémentale d'arbre

insertion d'une nouvelle primitive à chaque étape et reconfiguration de l'arbre pour optimiser le placement de la primitive (pourminimiser la profondeur de l'arbre obtenu)

161

INTERSECTIONS: VOLUMES ENGLOBANTS - AABB

Axis-aligned Bounding Box (AABB)

Définie par un centre C, trois vecteurs unitaires i, j et k, et trois demi-longueurs de côtés: hx, hy et hz.

162

INTERSECTIONS: VOLUMES ENGLOBANTS - OBB

Oriented Bounding Box (OBB)

Définie par un centre C, trois vecteurs unitaires bu, bv et bw,

et trois demi-longueurs de côtés: hu, hv et hw.

163

INTERSECTIONS: VOLUMES ENGLOBANTS - K-DOP

Discrete Oriented Polytope (k-DOP)

Définie par k/2 vecteurs unitaires bu, bv et bw,

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

164

Page 42: Cours-4-5-6 (1).pdf

Cours-4-5-6.ps

Page 42

INTERSECTIONS: THÈORÈME SAT 1

Théorème de l'axe séparateur (Separating Axis Theorem)

Pour deux polyèdres convexes P et P', disjoints, il existe un axe A sur lequella projection des polyèdres P et P' forme deux intervalles disjoints.Un tel axe est appelé axe séparateur.

Si les polyèdres sont disjoints, il existe un axe séparateur orthogonal à: � une face de P, � une face de P', � une arête de chacun des deux polyèdres.

� Dans les deux premiers cas, on définit un plan séparateur.

� Dans le dernier cas, on utilise le produit vectoriel des supports des axes pourrechercher un axe séparateur.

165

INTERSECTIONS: THÈORÈME SAT 2

Utilisation du théorème de l'axe séparateur

Test de rejet démontrant que deux polyèdres ont une intersection vide:

� On parcourt l'ensemble des axes orthogonaux à une face d'un des deuxpolyèdres puis l'ensemble des axes orthogonaux à deux arêtes.

� Si un de ces axes permet de séparer les polyèdres, on arrête, les deuxpolyèdres sont disjoints.

Généralisation: peut s'appliquer à des polyèdes "dégénérés" comme destriangles ou des droites.

Optimisation: on peut commencer par un test rapide sur des sphèresenglobantes.

Applications: intersections de lignes/triangles/boîtes.

166

INTERSECTIONS: RAYON/SPHÈRE 1

Intersection d'une demi-droite orientée avec une sphère (Haines 89)

Intersection d'une demi-droite O,v (v est un vecteur normalisé) avec une sphère de centre C et de rayon r.

Applications: sélections d'objets dont le volume englobant est une sphère par un pointeur, optimisation du rendu par lancé de rayon.

167

INTERSECTIONS: RAYON/SPHÈRE 2

Algorithmed = l . v; l2 = l. l;

if( l2 < r2 && d < 0 )

// sphère derrière l'origine et origine extérieure à la sphère

return false;

h2 = l2 - d2;

if( h2 > r2 )

// le rayon ne coupe pas la sphère

return false;

// il y a intersection et on recherche le point d'intersection

d' = sqrt( r2 - h2 );

// origine dans la sphère, on retourne le point le plus lointain

if( l2 < r2 )

return d + d'

// origine hors de la sphère, on retourne le point le plus proche

else

return d - d'

168

Page 43: Cours-4-5-6 (1).pdf

Cours-4-5-6.ps

Page 43

INTERSECTIONS: RAYON/BOÎTE 1

Intersection d'une demi-droite orientée avec une boîte (Haines 89, Kay andKajiva 86)

S'inspire du clipping Cyrus-Beck vu en cours. On recherche les intersections entrele 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

INTERSECTIONS: RAYON/BOÎTE 2

Éléments géométriques pour l'intersection d'une demi-droite avec uneboîte

170

INTERSECTIONS: RAYON/BOÎTE 3 - ALGORITHMETmin = - ; Tmax = + ; ∞ ∞

for( i = { u , v , w } )

d1 = l . bi ; d'1 = l . ci ;

// rayon parallèle à la plaque

� if( |d'1| < ) {

// rayon hors de la la plaque

if( d1 < -hi || d1 > hi ) return false;

}

// rayon coupe la plaque

else {

// calcul des paramètres des intersections avec les côtés 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 derrière 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 derrière l'origine

else return Tmax;

171

INTERSECTIONS: AABB/AABB

Intersection de deux boîtes alignées sur les axes

Algorithme

for( i = { u , v , w }

// axe séparateur

if( (ai,min > bi,max) || (ai,max < bi,min) ) {

return false;

return true;

172

Page 44: Cours-4-5-6 (1).pdf

Cours-4-5-6.ps

Page 44

INTERSECTIONS: OBB/OBB 1

Intersection de deux boîtes orientées

On recherche un axe séparateur sur:

� Les trois axes de chacune des deux boîtes. � Les 3×3=9 axes orthogonaux à une arête de chacune des boîtes.

Optimisations:

� Un faible précision des calculs suffit � On peut ne faire la recherche que sur les 6 axes des boîtes, les rejets

sur les 9 autres axes sont assez rares et correspondent à des cas limites. � On privilégie une boîte qui devient une AABB, l'autre est située par

translation et rotation à partir de celle-ci.

173

INTERSECTIONS: OBB/OBB 2

Intersection de deux boîtes orientées en dimension 2

Se ramène à la recherche d'un axe séparateur sur les 4 axes des deux boîtes

174

INTERSECTIONS: OBB/OBB 3

Intersection de deux boîtes orientées: éléments géométriques

Sur chaque axe, on calcule la distance CC'.l de la projection des centres, ainsi quele rayon r de la projection des boîtes:

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 séparateur.

175