Support - Laboratoire d`informatique interactive de l`ENAC
Transcription
Support - Laboratoire d`informatique interactive de l`ENAC
Infographie 2D pour l’interaction Introduction Stéphane Conversy ENAC - [email protected] Éléments: Nicolas Roussel, Projet InSitu, Université Paris-Sud Qu’est ce que l’Informatique Graphique ? Exemples d’applications • Modélisation • Affichage d’informations – structures de données pour la représentations de scènes 2D ou 3D • Rendu – construction d’images 2D à partir de modèles 2D ou 3D – – – – cartographie données statistiques imagerie médicale visualisation scientifique (biologie, mécanique, etc.) • Animation – simulation de changements au cours du temps • Interaction – avec un ou plusieurs utilisateurs MillionVis, J-D Fekete & C. Plaisant, HCIL University of Maryland, 2002 Exemples d’applications Exemples d’applications • Simulation et animation – – – – • Conception – – – – poignées de portes voitures architecture VLSI CATIA (Prost Grand Prix) simulateurs de conduite, de vol, d’assemblage dessins animés, films jeux (marché supérieur au cinéma) œuvres d’art "Toy Story 2", Disney / Pixar, 1999 Flight simulator, Microsoft, 2002 "Star Wars Episode II", Lucasfilm, 2002 "Impressions of San Francisco » P. Litwinowicz, Apple Computer, SIGGRAPH 97 DataCAD Exemples d’applications Quels sont les problèmes que l’on se pose ? • Que veut-on afficher ? – Primitives graphiques • Formes, transparence, transformation, style • Comment les afficher ? – Algorithmes • Tracé, remplissage, transparence • Comment s’en servir ? – Outils, API • Photoshop/Illustrator, opengl, svg… • Qu’est-on capable d’afficher pour l’interaction ? – Services pour l’interaction – Performances Exemple 1: discrétisation de ligne par point médian • But: allumer les pixels les plus proches d’une ligne passant par deux pixels donnés (discrétisation ou rasterisation) Exemples d’algorithmes fondamentaux (x1,y1) 1er octant (x0,y0) Une première approche Point Médian y = ax+b a = (y1-y0)/(x1-x0) b = y0 Pour x = x0 à x1: y = arrondi(ax+b) allumerPixel(x,y) À chaque itération calculs en virgule flottante calculs d’arrondi Points médians Solution à base de point médian Equation implicite de la droite: F(x,y) = ax + by + c a = (y1-y0) b = (x0-x1) c = y0 Propriétés: F(xi,yi) > 0 : point (xi,yi) en dessous de la droite F(xi,yi) = 0 : point (xi,yi) appartient à la droite F(xi,yi) < 0 : point (xi,yi) au dessus de la droite Algorithme du point médian Après avoir choisi un pixel (xi,yi), calculer la position du point médian suivant (xi+1, yi+ 1/2), et décider du prochain pixel à allumer E (xi+1,yi+ 1/2) (xi,yi) (xi+1,yi+ 1/2) (xi,yi) NE (xi+1,yi+ 1/2) (xi,yi) Calculs préliminaires Position du point médian correspondant à (xi,yi): di = F(xi+1,yi+1/2) : « valeur de décision » Calcul incrémental : si choix E: di+1 = F(xi+2, yi+1/2) = di + a incrE= a si choix NE: di+1 = F(xi+2, yi+3/2) = di + a+b incrNE=a+b d0 = F(x0+1,y0+1/2) = F(x0,y0)+a+b/2 = a+b/2 Choix E ou NE, test du signe d>0 ? ! 2d>0 On recalcule les incréments: incrE = 2a incrNE = 2(a+b) Algorithme du point médian a = y1-y0 b = x0-x1 d = 2a+b incrE = 2a incrNE = 2(a+b) x = x0 y = y0 Tant que x<=x1: allumerPixel(x,y) ++x si d <= 0: d += incrE sinon: d+=incrNE; ++y Calcul en entiers ! Que des additions ! Tesselation Exemple 2: tesselation d’une courbe de Bézier Définie par 4 points: P0 et P3 extrémités P1 et P2 définissent les tangentes aux extrémités -1 3 -3 1 3 -6 3 0 B(t) = [t3 t2 t 1] -3 3 0 0 1 0 0 0 • P2 P0 P1 P2 P3 • P1 x(t) = (-x0+3x1-3x2+x3) t3 + (3x0-6x1+3x2) t2 + (-3x0+3x1)t + x0 y(t) = (-y0+3y1-3y2+y3) t3 + (3y0-6y1+3y2) t2 + (-3y0+3y1)t + y0 ou B(t) = (1- t)3P0 + 3t(1-t)2 P1 + 3t2(1-t)P2 + t3 P3 Polynômes de Bernstein Rastérisation – passage du continu au discret – Ex: la ligne analytique -> ensemble de pixels P0 Tesselation: – Remplissage d’un plan par des formes qui ne se superposent pas et sans trou – Ex: passage d’une surface continue à une représentation par parties – Bezier - > segments de lignes – « vectorisation » P3 • Analytique -> Tesselation -> Rastérisation 1ère Méthode: méthode itérative Algo itératif Principe: évaluation de x(t) et y(t) pour 0<=t<=1 5 mul et 3 add (init: 7 mul 6 add) fn+1 = fn + dfn dfn = dfn-1 + d2fn-1 d2fn-1 = d2fn-2+d3fn-2 Optimisation 1: représentation de Horner d’un polynôme f(t) = at3+bt2+ct+d=(((at+b)t+c)t+d 3 mul et 3 add Optimisation 2: différence en avant avec dt constant, on réutilise le calcul précédent s= dt f(t+s) = f(t)+df(t) df(t) = 3at2s+t(3as2+2bs)+as3+bs2+cs Optimisation 2.5: Même technique avec df(t) et d2f(t): d2f(t) = d(df(t)) = df(t+s)-df(t) = 6as2t+6as3+2bs2 d3f(t) = d(d2f(t)) =d2f(t+s)-d2f(t) = 6as3 = cte Valeurs initiales: f0=d df0=as3+bs2+cs d2f0=6as3+2bs2 d3f0=6as3 dessineBezierIter(courbe,n): x=courbe.P0.x init() pour i=0 à n: x += dx dx += d2x d2x += d3x tracerSegment(x,y) 6 add au lieu de 12 mul et 9 add Résultat dépendant de la forme 2ème méthode: subdivision Subdivision d’une courbe de Bezier Par subdivision: P = Q + T On subdivise jusqu’à une « précision suffisante » P2 8000 4400 2420 1331 P0 P1 P2 P3 D0 D1 D2 = 1/8 D3 1331 0242 0044 0008 P0 P1 P2 P3 dessineBezier(courbe,e): si rectiligne(courbe,e) dessineSegment(courbe.P0,courbe.P3) sinon subdivise(courbe,gauche,droite) dessineBezier(gauche,e) dessineBezier(droite,e) D2 P0 D1 G0 G3 D0 P1 G0 G1 G2 = 1/8 G3 G2 P3 G1 D3 Avantage: indépendant de la forme de la courbe Inconvénient: calcul du test de précision coûteux API de plus haut-niveau pour le tracé de ligne Autres algorithmes Avec OpenGL: Remplissage de polygones direct mode glBegin(GL_LINES); glVertex2i(x0,y0); glVertex2i(x1,y1); glEnd(); Triangles, polygones quelconques Antialiasing Clipping, culling Enlever les parties non visibles Gestion de la profondeur Partitionnement spatial BSP-tree, Quad-trees… Avec SVG: svgDoc.add(new SVGLine(x0,y0,x1,y1)) Retained mode Depth Buffer Tesselation des contours Epaisseur de traits, pointillés, bevel/rounded Vue d’ensemble Description d’une scène Photoshop,illustrator, 3DStudio Graphe de scène (Scene graph) Attributs de haut-niveau SVG, Inventor, TkZinc Images Primitives graphiques Java2D,GDI, MacOSX Algorithmes fondamentaux d’IG OpenGL, DirectX Représentation des images bitmap rgb packed rgba indexé 1000101001 0010100011 1001111100 0011001010 rgbrgbrgbrgbrgbrgb rgbrgbrgbrgbrgbrgb rgbrgbrgbrgbrgbrgb rgbrgbrgbrgbrgbrgb grayscale rgb planar rgbargbargbargbargbargb rgbargbargbargbargbargb rgbargbargbargbargbargb rgbargbargbargbargbargb iiiiiiiii iiiiiiiii iiiiiiiii iiiiiiiii 0: rgb 1: rgb palette 2: rgb 3: rgb …. Rasterisation Discrétisation Clipping Masking Opérations sur les images ggggggggg ggggggggg ggggggggg ggggggggg bbbbbb gggggg bbbbbb rrrrrrrr gggggg bbbbbb rrrrrrrr gggggg bbbbbb rrrrrrrr gggggg rrrrrrrr g sur 8,16,24 bits… • Filtres rrrrrrrrrrrrrrrrrrrrrrrrgggggg ggggggggggggggggggbb bbbb bbbbbbbbbbbb en mémoire... – Définition super générale: traitement mathématique des pixels d’une image • Généralement, opération impliquant les pixels voisins d’un pixel donné ggggggggg ggggggggg fff ggggggggg fff ggggggggg fff imag e filtre ggggggggg fff ggggggggg fff ggggggggg fff ggggggggg hhhhhhhh h hhh hi,j = fk-1,l-1*gi-1,j-1+fk,l-1*gi,j-1+… >convolution Exemples de filtres Opérations sur les images • Histogramme – Occurrence d’une couleur dans une image • Box filter – Filtre passe-bas – Blur 111 1/9 x 111 111 nb 0 • Filtre de Sebel – Filtre passe-haut – Détection de contours -1 -2 -1 0 0 0 1 2 1 256 nb nb g sombre Format des images • Sans perte: – PNG • • • • format libre Indexé, grayscale, rgba, entrelacé Mng pour l’animation Compressé à la zlib – GIF • Indexé, un index pour l’opacité • Gif animé • Compressé à la zlib • Avec perte: – JPEG – Transformée de Fourier et élimination des basses fréquences g nb g claire nb g contrastée Tesselation du 8 g peu contrastée Tesselation du cercle • 2D vs 3D – 3D: qualité de rendu (réalisme) – 2D: qualité de lecture (texte et forme) Point médian pour le cercle Remplissage par Scan-line Arêtes actives Scanline Tesselation des polygones Support du pixel LCD Sous-pixel Spécification des couleurs en sous pixel RVB RVB Halo blanc, trou noir, effet de relief Trou > taille d’un pixel Mélange des sous pixels R et B -> luminosité accrue Comparaison deux à deux -> contraste perçu AntiAliasing AntiAliasing et Perception • Améliorer la perception des formes • Améliorer la qualité esthétique Techniques d’anti-aliasing • Par primitive – À chaque pixel à allumer, on calcule la luminosité des voisins selon des algos spécifiques aux primitives (ligne, cercle etc) – Gupta-sproull • Global – FSAA: Full Scene Anti-Aliasing – Supersample (voire Multisample) Sub-pixel anti-aliasing SubPixel Antialiasing Sub-pixel anti-aliasing et texte • Ne marche qu’avec des LCD • Pas de rotation de l’écran ! • Point médian pour le cercle • Qualité de rendu illustrator, opengl (scanline vs vector) (image rond moche) – Parler de freetype et du rendu de fonte • Polygone -> courbe de bezier • Polygone convexe vs concave Luminosité / surface • Evaluer la quantité de « matière colorée » ? • Luminosité: perception de la luminance • Quelle est l’influence de la surface sur la luminosité ? • => expé – Anti-aliasing – Pixel: Diagonale – Sous-pixel Transformations affines géométriques • Exemples de transformations affines – – – – – – • Coordonnées homogènes • translation homothétie (scale) rotation projection cisaillement (shear) toute composition de transformations affines Un point en 2 dimensions est spécifié par 3 coordonnées x – V = y w=1 habituellement (sinon, diviser par w) w • les transformations s’expriment par des matrices 4x4: V’ = MV Les transformations affines préservent la géométrie – une ligne reste une ligne – un polygone reste un polygone – une quadrique reste… une quadrique x y 1 1 0 tx 0 1 ty 0 0 1 translation x+tx y+ty 1 x y 1 sx 0 0 0 sy 0 0 0 1 x*sx y*sy 1 homothétie x y 1 cosa sina 0 -sina cosa 0 0 0 1 x*cosa+y*sina -x*sina+y*cosa 1 rotation Programmation des transformations • les compositions de transformations correspondent à des produits de matrices: V’=M1M2…V x y 1 1 0 tx 0 1 ty 0 0 1 translation sx 0 0 0 sy 0 0 0 1 homothétie x’ y’ 1 x y 1 1 0 0 0 1 0 0 0 1 identité x y 1 • OpenGL gère une matrice de transformation courante MMV • On peut y appliquer des transformations en appelant glLoadIdentity, glRotatef, glTranslatef, glScalef, glLoadMatrix, glMultMatrix…… glLoadIdentity() glRotatef(35,0,0,1) glTranslatef(20,0) glBegin(…) glVertex(…) MMV MMV MMV V’ 1 0 0 0 1 0 0 0 1 MMVxR MMVxT MMVxV=IRTxV Ordre des transformations Repère global fixe ou repère local transformé Repère local transformé Ordre d’application (celui du code) glLoadIdentity(…) glTranslatef(…) glRotatef(…) glBegin(…) glVertex2f(…) translation puis rotation ? ou rotation puis translation ?! Ordre d’application (inverse du code) Grand repère global fixe V’=ITRV Repère global fixe ou repère local transformé Rotation centrée sur le barycentre Repère local transformé Repère local Ordre d’application (celui du code) glLoadIdentity(…) glRotatef(…) glTranslatef(…) glBegin(…) glVertex2f(…) translation Ordre d’application (inverse du code) Grand repère global fixe V’=IRTV Repère global rotation rotation ? glLoadIdentity(…) glTranslatef(pos) glTranslatef(bary) glRotatef(…) glTranslatef(-bary) glBegin(…) glVertex2f(…) Zoom centré curseur Zoom centré curseur Zoom centré curseur Par mise à jour des coordonnées P’ P • F = point de focus F • • • • Zoom: FP’ = FP x ds, avec ds = snew/sold Pour chaque P: P.x = (P.x-F.x) x ds + F.x Correspond à TFS-dsT-F « Zoom coordonnées » Avec 2 opérations globales glLoadIdentity(…) glScalef(zoom,zoom) glTranslatef(xpan, ypan) drawScene() • • Zoom est contrôlé par la molette, que devient xpan quand la molette émet un événement ? Propriété: en coordonnées écran, F’=F – (xf + xpan2) x s x ds = (xf + xpan) x s – xpan2 = ((xf + xpan) / ds) - xf – xpan2 = xpan + ((1-ds)/ds) (xpan+xf) • • description analytique x=rcos(t) y=rsin(t) description vectorisée tesselation description pixelisée rasterisation Bien pour appliquer des rotation et translations globales Marchent pas pour des épaisseur indépendantes du zoom Picking isInBezierBBox(cur.x, cur.y) ? Yes ! A isInBezier(cur.x, cur.y) ? Euh… • Déterminer sur quel objet a cliqué l’utilisateur • Méthode analytique A A isIn(cur.x, cur.y) ? isInBoundingBox(cur.x, cur.y) ? Rasterization dans la zone curseur Picking OpenGL Gestion intégrée du graphisme Redisplay() • On affiche normalement la scène… • …dans une toute petite fenêtre autour du curseur • C’est la définition du picking: à qui appartient le pixel sous le curseur ? Programme Rafraîchissement VRAM glLoadIdentity(…) glTranslatef(pos) glRotatef(…) glTranslatef(-bary) glBegin(…) glVertex2f(…) A Redisplay() Programme Pour chaque objet: répondre aux évts et changer ses propriétés afficher l’objet le mettre au bon endroit utiliser telle couleur épaisseur tesseler rasterizer Rafraîchissement VRAM Écran Contrôleur video Pour chaque objet: répondre aux évts et changer ses propriétés afficher l’objet le mettre au bon endroit utiliser telle couleur épaisseur tesseler rasterizer Écran Contrôleur video Programme Pour chaque objet: répondre aux évts et changer ses propriétés Pour chaque objet: afficher l’objet le mettre au bon endroit utiliser telle couleur épaisseur tesseler rasterizer Pour chaque objet: répondre aux évts et changer ses propriétés Graphe de scène Graphe de scène Pour chaque objet: afficher l’objet le mettre au bon endroit utiliser telle couleur et épaisseur tesseler rasterizer Type de graphe de scène Liste (Display list) • But: Déporter une partie du travail de gestion des scènes graphiques dans un module logiciel • Rôle pos color pos color pos color pos color – Pour faciliter la vie du programmeur…………… – Retenir les objets graphiques Arbre Invaders pos color • Création, modification géométrique et de style – Gérer l’affichage • Savoir quand ré-afficher • Optimisation – Gérer le picking – Générer des événements de haut niveau pos Troopers color Alien première ligne • Enter et Leave shape • Timer pos pos color color Alien deuxième ligne pos Mothership color Ordre d’affichage Graphe (DAG) flyweight SVG Invaders pos color pos Troopers color Alien première ligne pos color pos color pos color • Implicite: algorithme du peintre Alien deuxième ligne pos color pos color Modèle en couches • pos Mothership color pos color Jean-Daniel Fekete Problème du mélange des représentations graphiques – Objet d’intérêt / Interaction (feedback) – Optimisation difficiles • Modèle en couches superposées – Spécialisées – Fond, Grille, Principale, Sélection (handles), Manipulation directe (outline), Lasso de sélection, curseur – Modèles Graphiques différents (XOR) • Interaction – Traversée des couches de haut en bas, jusqu’à ce que l’une d’elles prenne en compte l’événement • Dessin – Traduction du modèle Couche(Layer)/Piles(Stack) , Extensions – Optimisations: cache, XOR, transient, animée Curseur Manip. Directe Selection (poignées) Vue principale Grille Arrière-Plan • Explicite: x,y,z – Pas forcément compatible avec le scene graph… – Tri en z, puis algo du peintre – Ou utilisation du depth buffer z=1 z=0 Modèle en couches : interaction z=3 z=2 Type de graphe de scène: Tag Ouchuis.com Ouchuis.com A31 A31 A6 A6 identity Colorier en blanc ? Dégrouper… Ouchuis.com transfoCoord) A6 racine A31 Algo peintre groupe1 groupe2 Scale(zoom) Type de graphe de scène: Tag Autres graphes • Spatial data structure – BSP tree, Quad tree, R-tree • But: – Déterminer rapidement ce qui est visible (culling) – Déterminer rapidement ce qui est pické tag1 tag2 selected Autres graphes • Display graph – Scene graph: séparer code applicatif de la gestion du graphisme – Display graph: isoler l’API pour le programmeur du code applicatif et gérer un graphe optimisé pour l’affichage • Ex: GVT pour Batik • Model graph – Ex: hiérarchie de widgets • Problème: synchronisation des graphes… API facile, implémentation difficile