Algorithmique Graphique et Modélisation 19 février 2007
Plan du cours Dessins 2D/3D 1 Tracés de primitives 2 3 4
Introduction Dessins 2D/3D Les primitives d affichage (ou primitives de traçage) sont implantées par matériel ou logiciel Dispositif vectoriel : l image est construite à partir de segments on relie deux à deux des points peu éloignés ces dispositifs sont en train de disparaître Dispositif matriciel : on construit l image point par point procédure qui peut être lourde on peut tracer n importe quoi (courbes)
Les systèmes matriciels Affichage de tout type de courbe Affichage de surfaces remplies Couleurs ou niveaux de gris Affichage de caractères Matériel pas cher Circuits de traçage performant Production d images complexes
Traçage Dessins 2D/3D Définition du traçage Dans les systèmes matriciels, le traçage consiste à déterminer les pixels à allumer pour approcher au mieux la forme à dessiner
Notion de rasterisation Une primitive est définie dans l espace cartésien Le tracé est effectué sur un écran (matrice de n m pixels) Si on veut tracer des primitives de base, on a besoin de les discrétiser (rasterisation)
Tracé de segments : 3 algorithmes Algorithme naïf Algorithme incrémental Algorithme de Bresenham
Algorithme naïf Dessins 2D/3D On trace le segment à l aide de son équation cartésienne L équation cartésienne d une droite passant par A(x A, y A ) t et B(x B, y B ) t est donnée par : y = ax + b avec a = y B y A x B x A et b = y A ax A On calcule, pour chaque valeur entière de x, la valeur arrondie de y correspondante
Algorithme naïf : implantation void l i g n e n a i f ( i n t xa, i n t ya, i n t xb, i n t yb ) { i n t x, y ; double a, b ; a = ( double ) ( yb ya ) / ( xb xa ) ; b = ya a xa ; for ( x = xa ; x <= xb ; x++ ) { y = round ( a x + b ) ; a l l u m e p i x e l ( x, y ) ; } } Avantage : simplicité algorithmique Inconvénients : Multiplication et addition en virgule flottante Arrondi Très coûteux et lent
Algorithme incrémental de base On pose y i = y 0 + ai et x i = x 0 + i On doit afficher les pixels (x i, round(y i )), avec i = 0,..., (x B x A ) On a y i+1 = y 0 + a(i + 1) = y i + a relation de récurrence
Algorithme incrémental : implantation void l i g n e i n c r e m e n t a l ( i n t xa, i n t ya, i n t xb, i n t yb ) { i n t x=xa, y=ya ; double a, b ; a = ( double ) ( yb ya ) / ( xb xa ) ; b = ya a xa ; for ( x = xa ; x <= xb ; x++ ) { a l l u m e p i x e l ( x, round ( y ) ) ; y += a ; } } Avantage : plus de multiplication en flottants Inconvénients : Addition en virgule flottante Arrondi On voudrait un algorithme sans arrondi et sans opérations avec des flottants
Algorithme de Bresenham Algorithme incrémental en x et en y Pour chaque pixel, on quantifie la différence entre ses cordonnées entières (utilisées pour l affichage) et réelles(calculées) Application dans le premier octant (angle d inclinaison compris entre 0 et 45 ) puis généralisation
Algorithme de Bresenham (x p, y p ) est le dernier point allumé, on souhaite déterminer le point (x p+1, y p+1 ) à allumer Deux possibilités : le pixel E = (x p + 1, y p ) (point Est) ; le pixel NE = (x p + 1, y p + 1) (point Nord-Est) ;
Algorithme de Bresenham Soit Q le point d intersection de la droite avec x = x p + 1 Soit M le milieu du segment [E, NE] Si M est au-dessus de Q alors on choisit E Si M est au-dessous de Q alors on choisit NE
Algorithme de Bresenham : premier octant (entre 0 et 45 ) x = x 2 x 1, y = y 2 y 1 δne = 2( y x), δe = 2 y d p = 2 y x Allumer le pixel (x 1, y 1 ) pour x = x 1 + 1 à x 2 faire si d p 0 alors d p = d p + δe sinon d p = d p + δne y + + finsi Allumer le pixel (x, y) fin pour
Algorithme de Bresenham Plus grande complexité algorithmique Opérations simples sur des entiers Algorithme adapté pour le tracé de tout segment il faut généraliser aux autres octants (cela ne joue que sur les incréments de x et de y)
Tracé de cercles : 3 algorithmes On considère un cercle centré en l origine, de rayon 1 Algorithme naïf Algorithme incrémental Algorithme de Bresenham
Algorithme naïf Dessins 2D/3D On part de l équation paramétrique ou cartésienne On trace des petits segments pour éviter des calculs trop coûteux (racine carrée ou sinus et cosinus) on a une approximation du cercle On trace dans un octant (ex. entre 0 et 45 ) puis on utilise les symétries
Algorithme incrémental de base Chaque point d un cercle est la rotation d un autre point On part d un point initial, et on calcule les autres par rotation : { xi+1 = x i cos θ y i sin θ y i+1 = x i sin θ + y i cos θ Quatre multiplications et une addition (calcul du sin et du cos une seule fois) Accumulation d erreurs (à cause du problème d arrondi)
Algorithme de Bresenham (deuxième octant) Soient P(x, y) le précédent pixel allumé, et A(x + 1, y) et B(x + 1, y 1) les deux pixels susceptibles de l être On définit les positions de ces points par rapport au cercle par : D(P) = x 2 + y 2 r 2 D(A) = (x + 1) 2 + y 2 r 2, D(A) < 0 si A est sous le cercle, sinon A est au-dessus du cercle D(B) = (x + 1) 2 + (y 1) 2 r 2, D(B) < 0 si B est sous le cercle, sinon B est au-dessus du cercle
Algorithme de Bresenham (deuxième octant) Critère de choix entre A est B : D = D(A) D(B) : Si D 0 D(A) D(B) on choisit B. Si D < 0 D(A) < D(B) on choisit A.
Algorithme de Bresenham (deuxième octant) Amélioration : on pose S = D(A) + D(B) 4 cas : Si D(B) 0, D(B) = D(B) et D = D(A) + D(B) = S, d où : Si S 0 on choisit B Si S < 0 on choisit A Si D(A) > 0 et D(B) 0 (points au-dessus du cercle) alors S > 0 : on choisit B. Si D(A) 0 et D(B) < 0 (points au-dessous du cercle) alors S < 0 : on choisit A. Résumé : Si S 0 on choisit B sinon on choisit A
Algorithme de Bresenham (deuxième octant) Problème, S est complexe à calculer : S = (x + 1) 2 + y 2 r 2 + (x + 1) 2 + (y + 1) 2 r 2 = 2x 2 + 4x + 2y 2 2y + 3 2r 2 Solution : on appelle S i la valeur de S après avoir tracé i points, on peut calculer S i+1 en fonction du choix entre A et B. Si on va vers A : S i+1 = S i + 4x i + 6 Si on va vers B : S i+1 = S i + (4x i + 6) + ( 4y i + 4) Avec S 0 = S(x = 0, y = r) = 3 2r
Algorithme de Bresenham : deuxième octant (entre 90 et 45 ) x = 0, y = r S = 3 2r tantque x y faire Allumer le pixel (x, y) si S < 0 alors S = S + 4x + 6 sinon S = S + 4x + 6 + ( 4y + 4) y = y 1 finsi x = x + 1 fin tantque
Algorithme de Bresenham Avantages faible complexité : que des additions, multiplications et comparaisons Pas de fonctions trigonométriques à calculer Peut être adapté au traçage de couronnes et d ellipses Inconvénient : problème dans le cas de cercles concentriques pixels non allumés entre deux cercles
Introduction Dessins 2D/3D Définition On appelle remplissage l opération qui consiste à représenter des surfaces pleines Génération de surfaces pleines : à partir d un ensemble de côtés ou de sommets Deux approches : Techniques de balayage : déterminent si un point se trouve ou non à l intérieur d un polygone ou d un contour (balayage de haut en bas) Techniques à partir d un germe : partent d un point à l intérieur du contour et agrandissent l ensemble (les points adjacents) jusqu à arriver au contour
Différents types d algorithmes d après un contour mixte selon une description des contours Un cas spécial : les polygones superposés
d un polygone : première idée On suppose qu on a le contour fermé d un polygone On examine chaque point de la trame et on regarde s il est ou non à l intérieur du polygone Une amélioration : on calcule d abord l enveloppe convexe et on ne regarde que les points de cette enveloppe polygones simples Très coûteux et beaucoup de pixels examinés pour rien
Balayage des polygones Des pixels adjacents (sauf les cas des bords) sont susceptibles d avoir les mêmes caractéristiques cohérence spatiale Pour la visualisation graphique, les pixels sur une même ligne de balayage(sauf les cas des bords) sont susceptibles d avoir les mêmes caractéristiques cohérence de ligne
Algorithmes de la ligne de balayage (scanline) Algorithme à la précision image Travailler scanline par scanline Pour chaque scanline, on cherche les intersections avec le polygone Chaque intersection coupe la ligne en deux régions : intérieur et extérieur du polygone Tracer successivement des pixels contigus ayant des caractéristiques lumineuses similaires
Ligne de balayage (scanline) : un algorithme Déterminer y min et y max pour y = y min à y max faire Initialiser x min et x max pour chaque segment de la facette faire si le segment coupe la ligne y alors Calculer le point d intersection x entre la ligne y et le segment x min = min(x min, x) x max = max(x max, x) finsi fin pour pour x = x min à x max faire Afficher le pixels (x, y) fin pour fin pour
Algorithmes de la ligne de balayage (scanline) : quelques remarques On ne considère pas les contours horizontaux des polygones Problème si l intersection est au niveau d un sommet du polygone : faut-il ou non allumer le pixel Faible coût mémoire efficace des polygones Gère les transparences et ombrage (Gouraud, Phong) Gère les textures
Algorithme de la liste triée des côtés Repose sur le tri des intersections entre les lignes de balayage et les côtés du polygone l efficacité de l algorithme de remplissage dépend de celle du tri Algorithme : 1 Calculer l ensemble des intersections entre les lignes de balayage et les côtés du polygone 2 Trier la liste sur les lignes de balayage (par exemple de haut en bas) et sur les x croissants de la ligne (x 1, y 1 ) précède (x 2, y 2 ) dans la liste si y 1 > y 2 ou ((y 1 = y 2 ) et (x 1 < x 2 )) 3 Extraire chaque paire (x 1, y) et (x 2, y) de la liste triée et allumer les pixels entre x 1 et x 2 Liste générée très grande dans le cas de polygones complexes le tri est long
Algorithme amélioré de la liste triée des côtés Idée : séparer le tri vertical des y et celui horizontal des x Algorithme : 1 Calculer l ensemble des intersections entre les lignes de balayage et les côtés du polygone Faire le tri selon les x au fur et à mesure des lignes de balayage 2 Pour chaque ligne de balayage, extraire les intersections x et allumer les pixels Tri simplifié mais affectation d un volume mémoire plus important qui peut ne pas être utilisé côtés actifs : utiliser une liste chaînée
Algorithme de la liste triée des côtés avec côtés actifs Préparation des données : 1 Pour chaque côté du polygone, trouver la ligne de balayage la plus haute 2 Pour chaque côté, stocker la valeur initiale x d intersection, le nombre δy de lignes de balayages coupées, et δx l incrément de x entre deux lignes Générer le tracé : 1 Pour chaque ligne de balayage, ajouter tout nouveau côté dans la liste des côtés actifs 2 Trier dans l ordre des x croissants 3 Extraire les paires d intersection et allumer les pixels correspondant sur la ligne de balayage y 4 Pour chaque côté de la liste des côtés actifs, décrémenter δy de 1. Si δy < 0 enlever le côté actif de la liste
Algorithme de remplissage de côté Problème de l algorithme précédent : les listes Génération de surfaces pleines pour tous les côtés du polygone faire pour toutes les lignes de balayage faire si intersection entre la ligne et le côté alors Allumer les pixels à droite de l intersection ou les éteindre s ils sont déjà allumés finsi fin pour fin pour
Algorithme de remplissage de côté : exemple
Introduction Dessins 2D/3D Définitions On appelle fenêtrage (ou découpage) l opération qui consiste à découper un objet graphique (segment) selon les bords de la fenêtre de visualisation Dans le repère vue (plan de projection) on donne les coordonnées de la portion rectangulaire de fenêtre que l on souhaite afficher Sur l écran, l espace consacré à l affichage est appelé clôture, ou viewport
Utilité du fenêtrage Dessins 2D/3D Éliminer les parties de la scènes qui ne seront pas visualisées avant de faire tous les calculs Suivant la position de l observateur, on ne peut pas visualiser toute la scène (champ de vision limité) Les objets très éloignés seront très petits, voire invisibles (perspective)
Le fenêtrage 2D Dessins 2D/3D 2D rectangulaire : les côtés de la fenêtre sont parallèles aux axes des coordonnées Soit la fenêtre F définie dans [x min, x max ] [y min, y max ] d un point P(x, y) P(x, y) F x [x min, x max ] et y [y min, y max ] d un segment [P 1, P 2 ], avec P 1 (x 1, y 1 ) et P 2 (x 2, y 2 ) [P 1, P 2 ] F P 1 F et P 2 F
2D : Algorithme de Cohen-Sutherland C est un fenêtrage rectangulaire de segments Principe : on subdivise le segment en plusieurs petits segments ne pouvant appartenir qu aux catégories visible ou invisible Trois étapes : 1 Affectation d un code de 4 bits à chaque extrémité du segment 2 Classement du segment 3
Cohen-Sutherland : étape 1 Affectation d un code de 4 bits à chaque extrémité du segment bit1 = 1 : l extrémité est au-dessus de la fenêtre bit2 = 1 : l extrémité est au-dessous de la fenêtre bit3 = 1 : l extrémité est à droite de la fenêtre bit4 = 1 : l extrémité est à gauche de la fenêtre
Cohen-Sutherland : étape 2 Classement du segment On a les codes c 1 et c 2 de chaque extrémité si c 1 = 0000 et c 2 = 0000 alors il est visible totalement sinon si (c 1 ET c 2 ) 0000 alors il est invisible sinon il est partiellement visible fenêtrage (étape 3)
Cohen-Sutherland : étape 3 du segment Étape nécessaire si un segment est détecté partiellement visible On remplace l extrémité en dehors de la fenêtre par son intersection avec la fenêtre et on recommence les étapes précédentes
Algorithme de Cyrus-Beck Fonctionne sur les fenêtres convexes On utilise les équations paramétriques Comment connaître la position d un point Q par rapport à un côté de la fenêtre? produit scalaire entre PQ et la normale entrante n en P au segment : I(Q) = (Q P) n = 0 : Q appartient au segment I(Q) = (Q P) n < 0 : Q est à l extérieur I(Q) = (Q P) n > 0 : Q est à l intérieur
Algorithme de Cyrus-Beck d une droite par rapport à un côté, on a : L(t) = A + (B A)t I(Q) = (Q P) n I(L(t)) = (L(t) P) n On cherche l intersection de la droite et du côté de la fenêtre : (L(t) P) n t = (A P) n (A B) n
Algorithme de Cyrus-Beck Soit D = (B A) n Cas 1 : D < 0 la droite sort de la fenêtre : le point est à l extérieur de la fenêtre t = t sup est une borne supérieure Cas 2 : D = 0 le point est sur la fenêtre Cas 3 : D > 0 la droite entre dans la fenêtre le point est à l intérieur de la fenêtre t = t inf est une borne inférieure
Algorithme de Cyrus-Beck Le point d intersection d entrée : le maximum trouvé pour t inf Le point d intersection de sortie : le minimum trouvé pour t sup Pour chaque segment, on applique la méthode pour tous les bords de la fenêtre On vérifie que les intersections entre les valeurs possibles des t ne sont pas nulles : Si t inf > t sup : le segment est invisible Sinon le segment est visible
Algorithme de Cyrus-Beck t inf 0, tsup 1 pour tout segment à fenêtrer faire pour tout frontière i de la fenêtre faire si D.n i = 0 alors si w i n i < 0 alors Le point est invisible finsi sinon t = w i n i D n i si D.n i > 0 alors On cherche une valeur inférieure si t 1 alors t inf max(t, t inf ) finsi sinon On cherche une valeur supérieure si t 0 alors tsup min(t, tsup) finsi finsi finsi fin pour si t inf tsup alors Tracer le segment P(t inf ) à P(tsup) finsi fin pour
Algorithme de Weiler-Atherton Permet d effectuer des fenêtrages plus complexes Très performant pour le fenêtrage de polygones convexes Stratégie : se déplacer sur les contours du polygone et de la fenêtre Les polygones et la fenêtre sont orientés
Algorithme de Weiler-Atherton : étape 1 1 On calcule les intersections entre les contours du polygone et ceux de la fenêtre 2 On marque les points d entrée du polygone dans la fenêtre (points verts)
Algorithme de Weiler-Atherton : règle déplacement On relie les points entrants aux points sortant en suivant le contour du polygone On relie les points sortants aux points entrants en suivant le contour de la fenêtre Quand on relie à un point à l intérieur de la fenêtre, on suit le contour du polygone
Algorithme de Weiler-Atherton : règle déplacement Utiliser une bonne structure d adjacence
Le fenêtrage 3D Dessins 2D/3D Définition du volume de visualisation Fenêtre rectangulaire appartenant au plan de projection Projection parallèle : parallélépipède dont les arêtes sont parallèles à la direction de projection Projection perspective : pyramide infinie dont le sommet est le centre de projection
Volumes de fenêtrage Dessins 2D/3D Volumes de fenêtrage finis (en général) Donnés dans le repère observateur (en général)
3D : Algorithme de Cohen-Sutherland Étape 1 : bit1 = 1 : l extrémité est au-dessus de la fenêtre bit2 = 1 : l extrémité est au-dessous de la fenêtre bit3 = 1 : l extrémité est à droite de la fenêtre bit4 = 1 : l extrémité est à gauche de la fenêtre bit5 = 1 : l extrémité est devant la fenêtre bit6 = 1 : l extrémité est derrière de la fenêtre Étape 2 : si c 1 = 000000 et c 2 = 000000 alors il est visible totalement sinon si (c 1 ET c 2 ) 000000 alors il est invisible sinon il est partiellement visible Étape 3 : Calcul des intersections Étape 1
Calcul des intersections : équation des plans Plan de gauche : x = X D z Plan de droite : x = X D z Plan supérieur : y = Y D z Plan inférieur : y = Y D z Plan avant : z = Z avant Plan arrière : z = Z arrière
Introduction Dessins 2D/3D On a un ensemble d objets 3D Quelles lignes ou surfaces doit on éliminer pour l affichage? Actuellement il n existe pas d algorithme optimal qui permette de : déterminer les faces visibles d un objet pour l affichage ; afficher les parties visibles de l observateur (et pas des autres)
Catégrories d algorithmes Algorithmes travaillant dans l espace des objets : backface culling, Roberts, tri par profondeur, algorithme du peintre, arbres BSP Algorithmes travaillant dans l espace de l image : algorithme scanline, z-buffer, Warnock Algorithmes hybrides travaillant sur les deux espaces utilisés à des fins de précision (géométrie de l objet) et de vitesse (mémoire image)
Algorithmes dans l espace objet Chaque objet de la scène est comparé aux autres Propriétés géométriques respectées Si on a N objets, les algorithmes sont en O(N 2 ) Algorithme global : pour chaque objet faire Déterminer les parties non occultées par les autres objets Afficher ces parties selon une couleur fin pour
Élimination des faces arrières (backface culling) Les faces arrières sont les faces qui ne peuvent pas être visibles par l observateur La suppression des faces arrières suffit à éliminer les parties cachées si : L objet est seul dans la scène (il ne faut pas qu un objet puisse en masquer un autre) L objet est convexe (dans un objet concave, des faces avant peuvent être masquées par d autres) Une face est visible par rapport à l objet si le produit scalaire entre la normale sortante de la face et le vecteur vision est positif : V N > 0
Élimination des faces arrières (backface culling) Si V N > 0, la face est visible Si V N < 0, la face est invisible Si V N = 0, une arête de la face est visible
Élimination des faces arrières (backface culling) Exemple des points d une facette P 1 visible, P 4 invisible, P 2 et P 3 tout juste visibles
Algorithmes de Roberts Première solution qui a été proposée au problème de suppression des parties cachées Solution mathématique dans l espace objet Plusieurs étapes : 1 Élimination des arêtes et plans auto-cachés 2 Chaque arête de chaque volume est comparée aux autres volumes pour déterminer les portions occultées Coûts et volumes de calcules énormes, les volumes doivent être convexes Calculs précis
Algorithmes de tri en profondeur L algorithme tri en profondeur enrichit l algorithme du peintre insouciant en ajoutant une étape intermédiaire entre le tri des faces et leur affichage qui : Segmente les faces dont le recouvrement est partiel, Reclasse les faces pour lesquelles le classement par z maximal n est pas pertinent Algorithme 1 Tri par z maximal croissant 2 Résolution des cas problématiques par segmentation et reclassement 3 Affichage dans l ordre du tri
Algorithmes de tri en profondeur
Algorithmes de tri en profondeur L observateur en O regardant vers les z négatifs Soient deux faces F et F telles que le z maximal de F est supérieur au z maximal de F Cas où F et F ne peuvent se masquer : 1 extensions en x disjointes 2 extensions en y disjointes 3 F est de l autre côté du plan de F par rapport à l observateur 4 projections disjointes Traitement dans le cas où les faces peuvent se masquer : si F n a pas encore été déplacée, mettre F en fin de liste et la marquer déplacée (pour éviter des déplacements cycliques) sinon, découper F selon le plan de F et insérer les morceaux obtenus en bonne place dans la liste triée
Algorithme du peintre insouciant Que faire si plusieurs polygones de la scène se recouvrent? Idée directrice : peindre les facettes polygonales dans la mémoire vidéo suivant un ordre de distance décroissante au point d observation On dessine d abord les polygones les plus lointains, puis les polygones proches de l œil Les polygones plus proches cachent les polygones lointains Comme un peintre dessine d abord l horizon, puis l arrière-plan, puis le premier plan
Algorithme du peintre insouciant Tri : les faces sont triées en fonction de leur extension maximale en profondeur Tracé : chaque face est tracée dans sa totalité dans l ordre du tri de la plus lointaine vers la plus proche Problème : cet algorithme échoue dans les cas où les recouvrements imposent de ne pas tracer la totalité des faces
Algorithme du peintre insouciant Le plus intuitif des algorithmes Affichage direct à l écran Il faut trier les polygones On affiche toute la scène Efficace surtout sur des petites scènes Le critère de tri selon l extension maximale en profondeur n est pas satisfaisant (cas de superposition des faces) Certaines faces ne doivent être tracées que partiellement (interpénétration des faces)
Algorithme du peintre complet Trier les polygones dans l ordre des z croissants Si deux polygones ont des étendues en z qui se recouvrent, on teste : si les boîtes englobantes de leurs projections sont séparées ; si l un est le complément de l autre ; si leurs projections sont séparées. Si aucun test n est positif, on calcule l intersection des deux plans : nouveaux polygones à trier
Algorithme du peintre : tests de chevauchement Test 1 : les extensions en x de P et Q se chevauchent-t-elles? si non, P ne peut pas occulter Q si oui, passer au test 2 Test 2 : les extensions en yde P et Q se chevauchent-t-elles? si non, P ne peut pas occulter Q si oui, passer au test 3
Algorithme du peintre : tests de chevauchement Test 3 : P est-il entièrement du côté du plan de Q de plus éloigné du point de vue? si non, P ne peut pas occulter Q si oui, passer au test 4 Test 4 : Q est-il entièrement du côté du plan de P de plus proche du point de vue? si non, P ne peut pas occulter Q si oui, passer au test 5
Algorithme du peintre : tests de chevauchement Test 5 : intervertir P et Q et épéter les tests 3 et 4 Si les tests réussissent : afficher P et préparer le polygone suivant pour le comparer à Q Si les tests échouent, calculer l intersection de P et Q (droite) recouvrement cyclique Couper P le long de Q, retirer P de la liste et le remplacer ses deux parties Refaire l ensemble des tests
Arbres BSP Dessins 2D/3D Idée directrice : partitionner l espace en régions à l aide des plans définis par les facettes polygonales de la scène Cette partition de l espace détermine des ordres de visibilité pour les facettes en fonction de la région où se situe le point d observation La relation d ordre pour la visibilité repose sur le fait que pour une facette donnée, l affichage doit se faire suivant : 1 Les facettes situées dans le 1/2 espace ne contenant pas le point d observation 2 La facette traitée 3 Les facettes situées dans le 1/2 espace contenant le point d observation
Arbres BSP Dessins 2D/3D BSP : Binary Space-Partitionning Trees On construit un BSP-Tree 3D pour toute la scène en subdivisant les polygones qui sont intersectés par le plan du nœud Affichage des polygones par un parcours de l arbre : En premier les polygones qui sont derrière le nœud courant (par rapport à la caméra) Puis le noeud courant Puis, les polygones qui sont devant le nœud courant Sorte d algorithme du peintre Avec un ordre partiel Mais suffisant
Arbres BSP : construction En partant d une facette polygonale racine : 1 la scène est divisée en deux demi-espaces 2 les facettes qui sont intersectées par le plan de la facette racine sont partagées en deux facettes suivant l intersection 3 pour chaque demi-espace, une nouvelle facette racine est choisie pour réiterer le processus. Cette facette constitue une nouvelle branche dans l arbre binaire 4 Le processus s arrête lorsque l ensemble des facettes de la scène sont dans l arbre binaire
Arbres BSP : règles construction Partage du plan par les arêtes : chaque arête a partage le plan en un demi-plan interne p a,i et un demi-plan externe p a,e Règle de construction de l arbre : chaque nœud n de l arbre est associé à une arête a tous les fils gauches de n sont associés à des arêtes incluses dans p a,i tous les fils droits de n sont associés à des arêtes incluses dans p a,e Segmentation des arêtes : si nécessaire, on segmente les arêtes pour que la règle de construction de l arbre soit respectée Remarque : la qualité de l arbre (sa faible profondeur) dépend de l ordre d insertion des arêtes
Arbres BSP : construction
Arbres BSP : algorithme d affichage si arbre non vide alors si observateur devant arbre->racine alors AfficheBSPTree(arbre->filsdroit) Affichefacette(arbre->racine) AfficheBSPTree(arbre->filsgauche) sinon AfficheBSPTree(arbre->filsgauche) Affichefacette(arbre->racine) AfficheBSPTree(arbre->filsdroit) finsi finsi
Arbres BSP : illustration
Arbres BSP : extension à la 3D arête face plane demi-plan demi-espace
Arbres BSP : remarques Le même arbre binaire peut être utilisé pour différentes positions d observateur algorithme intéressant pour tracer une scène dans laquelle se déplace une caméra L arbre binaire doit être recalculé en cas de déplacement des objets dans la scène L affichage de la scène se fait par simple parcours de l arbre binaire Le choix des facettes polygonales racines pour la construction de l arbre binaire se fait, pour chaque branche, en testant quelques facettes prises au hasard. Celle qui provoque le moins de subdivisions de facettes est choisie.
Comparaison arbres BSP / algorithme du peintre Le BSP-Tree fait plus de divisions de polygones, mais l affichage est plus direct BSP-Tree : Pré-traitement plus long Coût mémoire plus élevé Temps par requête (position de la caméra) plus petit Algorithme du peintre : Pas de pré-traitement Temps par requête plus long Dans les deux cas : on affiche toute la scène
Algorithmes dans l espace image Propriétés géométriques des objets non respectées Si on a N objets et P pixels à allumer, les algorithmes sont en O(NP) Cas particulier du z-buffer qui necessite en plus beaucoup de mémoire Algorithme global : pour chaque pixel de l image faire Déterminer l objet le plus proche de l observateur Afficher le pixel dans la couleur appropriée fin pour
Algorithmes de la ligne de balayage (scanline) Algorithme : Pour tous les pixels (x, y s) de la ligne de tracé rechercher la face la plus proche qui couvre le pixel ; tracer le pixel de la couleur de la face la plus proche ; Fin pour Prétraitement des arêtes et stockage de leurs caractéristiques dans des listes triées
Algorithmes de la ligne de balayage (scanline) Déplacement le long d une ligne de tracé Calcul du pixel courant la profondeur de chaque pixel est calculée par incrément constant en fonction de la profondeur du pixel précédent Tracé des faces on tient à jour les informations : 1 le nombre de faces superposées 2 la face supérieure courante 3 un indicateur booléen couverte signalant qu une face est en cours de traçage À chaque rencontre d une face active, on met à jour les informations et l on décide de changer de face couverte courante en fonction des informations de profondeur
Algorithmes de la ligne de balayage (scanline) : avantages/inconvénients Faible coût mémoire efficace des polygones Gère les transparences et ombrage (Gouraud, Phong) Gère les textures
Algorithme du Z -buffer Technique permettant l affichage organisé par ordre de profondeur des éléments d une scène 3D Principe : stocker sous forme de tableau la valeur en profondeur (axe Z ) de chaque pixel d une scène 3D En comparant la profondeur de chacun des éléments du Z -buffer, on détermine ceux qui doivent être affichés ou non calcul de maximum pour chaque pixel vis à vis de l ensemble des objets présents en ce pixel Deux zones mémoires : une pour la couleur à afficher, l autre pour la profondeur minimum
Algorithme du Z -buffer pour tous les pixels (i, j) faire Z [i, j] fin pour pour chaque élément E de la scène faire pour chaque pixel (i, j) de E faire z profondeur de E en (i, j) si z > Z [i, j] alors Z [i, j] z c[i, j] = couleur de E en (i, j) finsi fin pour fin pour
Algorithme du Z -buffer : illustration
Algorithme du Z -buffer : remarques On peut préalablement supprimer les faces arrières La précision dépend de la taille du Z -buffer (nombre de bits/pixel) L ordre des polygones est sans importance Dans le cas de scènes décrites par les sommets des facettes, la valeur de profondeur n est pas définie de manière explicite pour toutes les cases du Z -buffer
Algorithme du Z -buffer : avantages/inconvénients Avantages : Mise en œuvre simple et s appliquant à toute forme d objet Le tracé peut être fait par scanline des faces Facile à implanter (soft et hard) et optimisable Gestion simple des recoupements entre objets Inconvénients : Taille mémoire nécessaire parfois importante : le stockage des valeurs de profondeur et couleurs associées à chaque pixel La décomposition de chaque surface élémentaire en pixels nécessite une puissance de calcul importante Si on trace de l arrière vers l avant, on va passer du temps à dessiner inutilement des faces qui seront ensuite recouvertes par des faces plus proches
Algorithme du Z -buffer en OpenGL Création des deux buffers : glutinitdisplaymode(glut RGBA GLUT DEPTH ) ; Activation : glenable(gl DEPTH TEST) ; RAZ des deux buffers glclear(gl COLOR BUFFER BIT GL DEPTH BUFFER BIT) ; Au cours d un même tracé, on peut activer et désactiver le Z -buffer par les commandes : glenable(gl DEPTH TEST) ; gldisable(gl DEPTH TEST) ;
Algorithmes par subdivision de l image (Warnock,...) Principe : partionnement de l espace en zones de recouvrement homogènes tire parti de la cohérence d espace : des pixels voisins partagent des propriétés similaires vise à séparer les zones de recouvrement des zones non problématiques (sans objets superposés) Stratégie de subdivisions : Subdivision récursive de l espace selon une stratégie de diviser pour régner Arrêt de la subdivision si on passe en dessous de la taille du pixel ou si l on est sur une zone suffisamment simple pour être dessinée sans test supplémentaire Il existe plusieurs stratégies de subdivisions appelées algorithmes de Warnock
Algorithmes par subdivision de l image (Warnock,...) si la face est plus petite qu un pixel alors on arrête le dessin sinon si la face est simple alors on dessine la face sinon on subdivise la face en n sous-faces f 1, f 2,..., f n DessinnerRégion(f 1 ) DessinnerRégion(f 2 )... DessinnerRégion(f n ) finsi
Algorithmes par subdivision de l image (Warnock,...) On doit définir une technique de subdivision et un test de simplicité Technique de division : subdiviser chaque zone jusqu à ce qu il n y ait qu un seul polygone dans la zone (plus le fond de l image) Test de simplicité : pour identifier le nombre de faces intersectant la région courante
Algorithmes par subdivision de l image (Warnock,...) Algorithme de division de Warnock (Quadtree) : Subdiviser l image en quatre zones carrées Si aucun polygone dans une zone : remplir la zone avec la couleur du fond Si un seul polygone dans la zone : remplir avec la couleur du fond et dessiner le polygone Si plusieurs polygones dans la zone : subdiviser la zone en quatre zones carrées
Algorithmes par subdivision de l image (Warnock,...) Divers modes d intersection entre une région rectangulaire et une face
Algorithmes par subdivision de l image (Warnock,...) Divers tests de simplicité peuvent être mis en œuvre : 1 Au plus une face est incluse dans la région courante 2 Présence d une face dominante qui recouvre toutes les autres 3 Aucune intersection entre les faces présentes
Comment choisir son algorithme niveau image? L algorithme idéal dépends : de la complexité de la scène ; du matériel disponible ; de ce qu on veut faire en plus de l affichage Le plus efficace : z-buffer Objets opaques Fourni gratuitement dans la librairie graphique Pas de pré-traitement Quelques effets de bord si on le connaît mal Scanline, quand on a moins de possibilités : Quand on ne peut pas utiliser la carte graphique Faible coût mémoire Lié à la fonction d affichage, peut être très efficace