Home page      

Page de Titre

Table détaillée


  Cours d'infographie
 

  Chapitre 7 : Image de synthèse,
visualisation et mathématiques

   I.S.I. Gramme  
-
Liège

Bitmap et vecteurs   Caméra virtuelle    Indépendance vis-à-vis des périphériques    Bases du dessin 2D

Fonctions de manipulation 2D      Bases du dessin 3D      Entités graphiques 3D     Fonctions 3D

Les polyèdres réguliers     

 


Bitmap et vecteurtop

Les images de synthèse sont rangées en 2 classes distinctes : les 'Bitmaps' où tous les pixels de l'image sont mémorisés et les 'Vectors' où seules sont mémorisées les définitions géométriques des objets, qui sont à chaque utilisation retransformés en bitmaps lors de l'affichage. Cette dernière méthode est bien sûr la seule qui permette des animations complexes avec mouvements de caméra, etc.

Par contre, la mémorisation de bitmaps permet d'obtenir des effets et des qualités d'image exceptionnels. En pratique, les deux méthodes sont souvent utilisées successivement et même de plus en plus intrinsèquement mélangées dans un même programme (voir les techniques de 'texture mapping').

Nous ne nous attarderons pas sur les programmes de 'Paint' qui permettent de retoucher manuellement les bitmaps. Malgré cela, n'oublions pas que ce sont des outils indispensables à l'infographiste. Le programme de ce type le plus célèbre est probablement 'Photoshop'. Depuis sa version 5.0, il gère maintenant les couleurs en 16 bits par composantes (R, G, B) permettant ainsi de rendre fidèlement 256 milliards de nuances différentes !


 

La caméra virtuelletop

Comme en photo, l'ordinateur utilise les lois de l'optique pour réaliser des images réalistes. Nous imaginerons donc que l'écran de visualisation est une fenêtre sur laquelle on va projeter une image ou une partie de l'image du monde situé derrière lui. Si ce monde est bidimensionnel, peu de problèmes se posent. Si, par contre, comme le monde réel, le mode virtuel est en 3 dimensions, nous effectuons donc une projection des entités géométriques du monde pour en faire des entités à 2 dimensions dans le plan de l'image.

La caméra peut être considérée comme faisant partie du monde virtuel qu'elle regarde. Elle est munie de ses paramètres propres comme la position, l'ouverture, l'orientation, etc. Cette façon de considérer le système permet au programmeur de manipuler les points de vue en ne modifiant en rien la géométrie du monde observé, et aussi de modifier un élément de ce monde sans perturber le point de vue.

Un programme d'animation en images de synthèse se résume donc à une structure de ce genre :

· Créer le monde immobile (le décor fixe)

· Créer les objets mobiles (le reste)

· Définir la caméra

· Boucle à effectuer pour toutes les images :

modifier la géométrie des objets mobiles

modifier les paramètres de la caméra

calculer une image

· Fin

Même dans un monde à deux dimensions, on doit pouvoir ne visualiser qu'une partie du monde. On associera à la caméra une 'taille de fenêtre' qui indique quelle portion du monde est vue.

Nous supposerons que, dans notre monde à 2 ou 3 dimensions, les coordonnées des entités qui le composent sont décrites par des nombres flottants. Les limites du monde sont donc vastes (par exemple de +2.000.000 à -2.000.000 dans chaque direction). Les dimensions et la position de la fenêtre de visualisation sont aussi données dans ces mêmes coordonnées.

En 2 dimensions, il suffit de préciser les cordonnées du centre de la fenêtre, sa hauteur et sa largeur (4 nombres). En 3 dimensions, nous devons donner plus de renseignements. Ainsi, on peut, par exemple, décrire une caméra par sa position (3 nombres), sonangle d'ouverture (1 nombre) et son orientation (2 ou 3 nombres). Cette dernière sera le plus souvent remplacée par les coordonnées (3 nombres) d'une cible située à une distance quelconque sur l'axe de la caméra. On peut malgré tout indiquer une dernière rotation : celle de la caméra autour de son axe propre.

 

Pour s'y retrouver plus aisément, on dit que l'on fait tourner le 'UP-VECTOR' autour de l'axe de visé. on appelle. UP-VECTOR le vecteur vertical situé dans le plan de la caméra.


L'indépendance vis-à-vis des périphériquestop

Pour éviter de devoir modifier profondément le logiciel pour l'adapter à divers types d'écran, de tables traçantes ou d'imprimantes, nous effectuons nos opérations de fenêtrage en 2 temps. Tous nos calculs vont ramener les coordonnées des objets du monde virtuel (les WC -World Coordinates) en coordonnées NDC (Normalised Device Coordinates) qui vont usuellement de 0.0 à +1.0 dans les deux directions X et Y. En dernier lieu, le DEVICE DRIVER ou programme de sortie, affichera nos entités géométriques dans le système de coordonnées réel du périphérique de sortie (les DC - Device Coordinates), par exemple pour les fenêtres de taille variable des systèmes multifenêtres comme Windows, MacOS, X-Windows, BEos, etc.

 

Conventions usuelles pour les axes

 

En 2D, du point de vue de la caméra,

X va de gauche à droite dans le sens positif

Y va de bas en haut dans le sens positif.

 

En 3D, du point de vue de la caméra, X va de gauche à droite dans le sens positif Y va de bas en haut dans le sens positif Z est tel que l'observateur regarde dans la direction des Z négatifs. Les Z positifs s'étendent donc vers l'arrière (la partie invisible) de l'image.

 

Règle de la main droite : Ecrivez un X sur l’ongle de votre pouce droit, un Y sur celui de votre index droit et Z sur celui de votre majeur droit. Mettant ces 3 doigts en trièdre, vous obtenez un système d’axe comme celui décrit ci-dessus, dit aussi trièdre dextrogyre.

En ce qui concerne les périphériques, les axes en coordonnées DC sont souvent définis avec l'axe vertical inversé (cas du PC et de la plupart des micro-ordinateurs).


 

Les bases du dessin en 2 dimensionstop

Windows et Viewports

Le terme Window désigne l'ensemble de paramètres permettant de transformer notre monde virtuel de ses coordonnées WC en coordonnées NDC. Ceci comprend principalement la définition de caméra virtuelle (en WC).

Le ViewPort est, lui, défini en coordonnées NDC et spécifie à quelle portion de l'écran doit correspondre l'image obtenue. Le cas simple où l'image occupe tout l'écran n'est pas le seul! Presque tous les programmes graphiques utilisent au moins une partie de l'écran pour des menus, d'autres vues, des zones de saisie de texte.

La procédure d'affichage d'un monde 3D se résume donc à :

· Projection 3D-2D de la fenêtre (window) en WC.

· Transformation des coordonnées WC de la fenêtre en coordonnées NDC du viewport.

· Transformation des coordonnées NDC du viewport en coordonnées DC du périphérique par le Device Driver.

Le problème de transformation se résume donc à transformer les coordonnées WC (x1, y1) et (x2, y2) des extrémités d'un segment de droite en coordonnées NDC (u1, v1) et (u2, v2). Sachant que la fenêtre ouverte sur le monde (WC) a pour coin inférieur gauche le point (Xmin, Ymin) et pour coin supérieur droit le point (Xmax, Ymax), nous pouvons faire une simple règle de trois :

que nous pouvons résoudre pour trouver les valeurs de u et v :

Chaque point d'une ligne ou d'une courbe doit être transformé de cette façon. De même, les coordonnées NDC seront transformée par une procédure similaire en coordonnées DC avant affichage. Nous remarquons tout de suite qu'un problème peut se poser : si le point calculé in fine se trouve hors du viewport, seule une partie de notre segment sera affiché. C'est la procédure de clipping que nous étudierons plus loin..

Primitives de dessin 2D

Les instructions de base disponibles dans le langage informatique ou dans la bibliothèque graphique peuvent varier. Dans tous les cas, si elles n'existent pas ou ne nous conviennent pas, il nous faudra les réécrire. Pour les périphériques du type 'table traçante' et aussi pour les tracés à l'écran, voici quelques primitives de tracé très utiles (inspirées du standard GKS) :

line(x1,x2,y1,y2)

Trace une ligne de (x1,y1) au point (x2,y2).

line_to(x,y)

Trace une ligne de la position courante (PC) au point (x,y).

move_to(x,y)

Déplace la position courante (PC) en (x,y).

line_rel(dx,dy)

Trace une ligne de la position courante (PC) au point (PCx+dx,PCy+dy).

move_rel(dx,dy)

Déplace la position courante (PC) au point (PCx+dx,PCy+dy).

On notera l'usage de la position courante PC qui constitue un 'curseur' mémorisé par les routines graphiques. Dans certaines librairies graphiques, il est possible d'utiliser plusieurs curseurs simultanément.

Dans certains langages (LOGO, Draw du Basic IBM), on trouve aussi des 'Turtle graphics' qui sont des descriptions de trajectoires vues du point de vue du curseur. Par exemple : avancer de 3, tourner à gauche de 45°, lever la plume, avancer de 4, baisser la plume, etc. Ce type d'implémentation est très utile en 2 D, par exemple pour le tracé des chaînes de caractères mémorisées sous forme vectorielle. Dans le programme AutoCAD, les fontes 'SHAPES' sont créées de cette façon. Il est très aisé de tracer des caractères de différentes tailles et dans n'importe quelle orientation avec ce type d'instructions.

Les entités graphiques de base

Les points

Les points sont définis (en coordonnées WC) comme deux nombres x et y. Dans quasi tous les programmes, ce sont des nombres flottants. Certains préfèrent travailler en nombres entiers, mais ceci pose de nombreux problèmes de précision pour les objets de petite taille (la moitié de 3, en nombre entiers, c'est quoi ???). On élimine partiellement cet inconvénient en travaillant dans un monde de taille limitée, où aucun objet ne peut être trop petit. Par exemple, un monde de 32000 x 32000 points et des objets de taille comprises entre 100 et 1000 points offre déjà pas mal de possibilités.

Un point P contient deux valeurs flottantes :

P.x et P.y

Nous utilisons ici une notation inspirée du langage C, où une structure de données porte un nom (ici P) et un élément de cette structure est désigné par le nom de la structure, un point et le nom générique de la zone concernée(ici P.x).

La structure d'un point 2D est donc :

struct Point { float x;
float y;
}

En 3 dimensions, nous étendrons la notion de point à la troisième coordonnée z :

struct Point { float x;
float y;
float z;
}

 

Les vecteurs

Les vecteurs représentent des directions ou des déplacements relatifs. Ils sont représentés de façon identique aux points. Bien qu'ils désignent une réalité physique différente, ils utilisent les mêmes structures de données que les points.

On utilisera très souvent des vecteurs normés, c'est-à-dire des vecteurs ramenés à une longueur unitaire. En effet par exemple, pour comparer deux directions identiques P et Q, la simple comparaison de P.x avec Q.x, etc. ne serait pas satisfaite si un des vecteurs a une longueur double de l'autre. Pour normer un vecteur, il faut diviser ses composantes par la longueur du vecteur (et faire attention au risque de division par zéro!).

L=sqr(P.x^2+P.y^2+P.z^2)

P_normalised.x = P.x/L

P_normalised.y = P.y/L

P_normalised.z = P.z/L

Les segments de droite

En conjonction avec un point, un vecteur peut servir à représenter un segment de droite. Il est en effet très facile de tracer un segment de droite à partir de son origine P0 (point) dans la direction V (vecteur). Pour cela, on utilise l'équation paramétrique vectorielle du segment :

P(a)=P0+a*V où a est un paramètre variant de 0 à 1,

P0 un point et V un vecteur de longueur égale à celle du segment

Les courbes (forme implicite)

Les courbes ne peuvent pas, pour nous, être représentées par des équations du type y = f(x) car ce type de représentation est souvent incomplet ou pose des problèmes d'algorithmes.

La simple ligne droite

nous pose déjà un problème. Le cas de la droite verticale est mieux décrit par x = Cste que par l'équation ci-dessus, où le paramètre a vaut l'infini et où la solution de l'équation est indéterminée.

Quant au cercle,

est l'équation du demi-cercle supérieur et non du cercle complet. Il nous faut donc 2 équations pour représenter le cercle complet.

Tournons nous donc vers la représentation implicite des équations définissant une courbe. L'équation d'une droite quelconque sera donnée par :

On peut montrer que la distance entre la droite et l'origine des axes est :

si l'équation de la droite est normalisée (c'est-à-dire que a, b et c sont tels que a2+b2=1), la distance entre la droite et l'origine des axes est :

Les courbes (forme explicite)

Remarquons que la ligne en tant que telle ne nous intéresse pas. Ce qui nous intéresse, c'est de tracer des segments de droite. Donc, nous allons expliciter l'équation implicite de la droite en fonction de deux de ses points qui sont les extrémités d'un segment (x1, y1) et (x2, y2). On obtient finalement :

Cette représentation est la plus utile. Elle permet de retrouver très facilement l'équation d'une droite passant par deux points.

Les courbes (forme paramétrique)

En 2D, on peut représenter une courbe par 2 équations explicites pour une variable appelée le paramètre.Une courbe en deux dimensions sera représentée par :

Bien sûr, il n'y a aucun problème à extrapoler cette représentation aux trois dimensions si nécessaire :


Usuellement, le paramètre variera d'une valeur 0 à une extrémité du segment de courbe qui nous intéresse à une valeur 1 pour l'autre extrémité. Ainsi, le segment de droite reliant les points (x1, y1) et (x2, y2) sera représenté par :

Cette forme permet de vérifier facilement l'intersection entre deux segments de droite du plan. Soit un second segment de droite représenté comme ceci :

Le point d'intersection est obtenu en égalant les membres de gauche des deux groupes d'équations ci-dessus. On obtient :

Si les droites ne sont pas parallèle, il existe une solution pour s et pour t. Si de plus , s et t sont tous les deux compris entre 0 et 1, c'est que les segment se coupent.

Les courbes de Bézier

Une courbe de Bézier  ( http://moshplant.com/direct-or/bezier/index.html )est une courbe paramétrique définie par 4 points (P1, P2, P3 et P4). Elle commence au point P1 et se termine au point P4. Sa direction à l'origine (t=0) est celle du vecteur P1-P2 et sa direction à l'extrémité (t=1) est celle de P3 - P4. Les coordonnées d'un courbe de Bézier sont données par l'équation paramétrique suivante :

ou encore :

et de même pour y (et pour z en 3 dimensions). On vérifie facilement que pour t = 0, on a bien x = P1x et que pour t = 1, on a bien x = P4x.

On peut vérifier facilement que le long de deux courbes de Bézier consécutives a et b (P1b = P4a), la courbure est constante à la jonction si les vecteurs terminaux sont égaux (P2b-P1b = P4a - P3a). On peut ainsi approximer une courbe quelconque par une suite de Bézier répondant à cette condition. Le vecteur à chaque jonction indique la direction de la tangente en ce point, et sa longueur est inversement proportionnelle à la courbure de la courbe.

Une courbe complexe constituée de segments de Bézier est en anglais une Piece-Wise Polynomial Curve. Cette courbe est continue si et seulement si les vecteurs terminaux de deux segments successifs sont égaux et opposés.

Référence sur Bresenham : p://www.loria.fr/~holzschu/cours/HTML/ICG/Resources/LineDrawing/04Lines/08.html

Le Dodécaèdre Régulier

Le dodécaèdre régulier est le quatrième des polyèdres réguliers. Il a 12 Faces, 30 Arêtes et 20 Sommets. Les faces sont des pentagones réguliers convexes. Les sommets sont des angles trièdres.

Autres polyèdres réguliers

Les autres polyèdres réguliers sont non convexes. Il s'agit de :

Le petit dodécaèdre étoilé        petit_dodecaedre_etoile.gif (41653 bytes)

Le grand dodécaèdre étoilé        grand_dodecaedre_etoile.gif (40935 bytes)

Le grand dodécaèdre        grand_dodecaedre.gif (53043 bytes)

Le grand icosaèdre        grand_icosaedre.gif (44807 bytes)        Définition Wikipedia des  polyèdres


top

Cette page est copyright B.Michel, 2009