Table des matières

Transformations de visualisation

1. Introduction

Les transformations de visualisation sont les transformations géométriques qui permettent d'obtenir une représentation bidimensionnelle (sous forme d'image) d'objets définis dans l'espace à trois dimensions.

Les transformations géométriques utilisées sont les transformations affines et la projection perspective.

Ces transformations sont mises en œuvre dans l'algorithme de rendu par objet, qui est fréquemment programmé sur les processeurs graphiques (GPU) via l'interface de programmation OpenGL.

Le système considéré est constitué de différents objets. L'ensemble des objets constitue la scène. Le système de formation de l'image est appelé la caméra (au sens de chambre photographique, camera en anglais). Dans ce document, on ne s'intéresse qu'à l'aspect géométrique du problème, et pas aux problèmes d'éclairage ni au remplissage final des pixels (rastérisation).

2. Positionnement des objets et de la caméra

Le positionnement des objets dans l'espace se fait au moyen de transformations affines. Certains objets peuvent être positionnés de manière absolue, d'autres sont positionnés relativement à d'autres objets. La méthode matricielle permet de faire cela facilement.

Les points caractéristiques des objets, par exemple les sommets des polyèdres, sont définis par leurs coordonnées homogènes :

On note M la matrice 4x4 de la transformation affine qui permet (par multiplication à gauche) de placer les points dans l'espace. Bien sûr, différents objets peuvent avoir des matrices différentes.

La deuxième étape consiste à positionner et orienter la caméra dans l'espace. Nous adoptons la convention consistant à fixer la caméra à l'origine du repère, sa ligne de visée étant l'axe Oz, dans le sens des Z décroissants. Au lieu de déplacer la caméra, nous appliquons une transformation affine à la scène. En effet, déplacer la caméra par une transformation affine revient à déplacer la scène par la transformation inverse.

Notons V la matrice de la transformation affine appliquée à la scène, la matrice de visualisation.

À ce stade des transformations, nous obtenons donc :

Le produit VM est appelée matrice de visualisation-modélisation (modelview matrix). Si l'on veut déplacer la caméra sans modifier la scène, on doit changer la matrice V seulement, c'est pourquoi il est préférable de stocker ces deux matrices individuellement.

3. Matrice de perspective

L'étape suivante est la multiplication par la matrice de perspective. Pour une projection orthoscopique, on saute cette étape.

d est la distance entre le centre de projection et le plan image. Nous allons aussi introduire un plan lointain en z=e, comme indiqué sur la figure suivante :

figureB.svgFigure pleine page

Par convention, seuls les points vérifiant la condition e<z<d seront représentés graphiquement sur l'image finale. Nous verrons plus loin l'intérêt de fixer un plan lointain. On remarque qu'avec la convention de visée adoptée d et e sont négatifs, tout comme z des points représentés.

L'application de la matrice de perspective à un point de coordonnées (x,y,z,1) donne :

Après la division perspective (division par la 4ième coordonnée), on obtient :

(x',y') sont les coordonnées de la projection dans le plan image. z' contient l'information de distance, qu'il faut garder pour l'algorithme du Z-Buffer. Cet algorithme consiste à ne retenir, sur chaque pixel de l'image finale, que le point projeté le plus proche, c'est-à-dire ici celui dont le z est le plus grand.

On choisit à présent a et b pour que le plan proche (le plan image) et le plan lointain soient invariants par la transformation de perspective. On obtient :

z' est alors une fonction croissante de z : les points les plus proches ont un z' plus grand (négatif).

On obtient ansi un point (x',y',z') compris entre le plan proche et le plan lointain, dont la projection sur le plan image est une simple projection orthoscopique.

4. Volume visualisé et coordonnées réduites

Le volume visualisé est déjà limité en z par le plan proche et le plan lointain. On le limite aussi dans les directions x et y. La figure suivante montre comment il est limité dans la direction x :

figureC.svgFigure pleine page

La largeur du plan image est ainsi Lx. On limite de manière analogue dans la direction y par une hauteur Ly. Après l'application de la projection perspective, le volume ainsi délimité devient un parallélépipède dont les côtés sont (Lx,Ly,d-e).

La réduction des coordonnées (ou normalisation) consiste à appliquer un changement d'échelle de manière à ramener les coordonnées des points de ce parallélépipède dans l'intervalle [-1,1]. Cette réduction permet au processeur graphique d'appliquer plus rapidement l'opération de troncature, qui consiste à éliminer les points situés en dehors du parallélépipède, la division perspective et la comparaison des distances (Z-Buffer).

La matrice de transformation affine effectuant cette réduction est :

La transformation de z effectuée est (lorsque w=1) :

On remarque que d-e>0 car ces deux distances algébriques sont négatives. Les points situés sur le plan lointain (z=e) ont donc une abscisse finale z'=-1. Les points du plan proche (z=d) ont une abscisse finale z'=1). Les points les plus proches de la caméra ont donc un z' plus grand. Cela résulte de la convention qui a été adoptée de pointer la caméra dans le sens des Z négatifs. Dans l'algorithme du Z-Buffer, il faudra donc retenir les points qui ont un z' plus grand.

On doit finalement multiplier cette matrice par la matrice de perspective calculée plus haut :

Dans le cas d'une projection orthoscopique, la matrice P est l'identité.

La matrice RP est appelée matrice de projection. La projection proprement dite se fait lorsqu'on divise par la 4ième coordonnée w (division perspective). Cette matrice conduit à des valeurs négatives de la quatrième coordonnée w (car les points représentés ont un z négatif). Dans l'implémentation OpenGL, cela conduit à des points finaux invisibles car le test de coupure suppose des valeurs de w positives. On modifie donc la matrice de la manière suivante, pour que les valeurs de w soient positives :

On remarque que le volume visualisé est un tronc de pyramique (pyramid frustum), d'ou le nom frustum donné couramment à cette transformation.

Pour une projection orthoscopique, on utilise la matrice R définie plus haut. Dans ce cas, les points proches de la caméra ont un z' plus petit. Dans l'algorithme du Z-buffer, il faut retenir les points qui ont un z' plus petit.

Il faut bien sûr placer l'objet à représenter dans le volume visualisé au moyen d'une translation, ce qui revient à déplacer la caméra avec la translation opposée. Par exemple, si l'objet est initialement défini au voisinage de l'origine, on lui appliquera une translation négative selon l'axe z pour le placer à peu près au milieu du volume visualisé (le tronc de pyramide). Cela revient à éloigner la caméra de l'objet, pour que celui-ci soit dans son champ de vision. Cette transformation de positionnement de l'objet fait partie de la transformation de visualisation définie plus haut.

5. Transformation complète

Pour l'algorithme de rendu par objet, l'ensemble des transformations se résume à la multiplication par une seule matrice :

La matrice de projection RP et la matrice de visualisation-modélisation VM sont généralement calculées séparément et multipliées au dernier moment, éventuellement par le GPU.

En partant des coordonnées d'un point (x,y,z), on obtient donc :

et enfin la division perspective :

Les coordonnées finales des points sur le plan image sans dans l'intervalle [-1,1]x[-1,1]. La dernière étape (effectuée par le GPU) est la transformation de viewport : elle consiste à transformer ces coordonnées réduites en coordonnées de pixels, en fonction de la taille de l'image en pixel. L'image finale est en effet une matrice comportant nx par ny pixels. Il s'agit d'une transformation affine de changement d'échelle qui transforme -1 en 0 et +1 en nx-1 (pour l'axe horizontal). Pour éviter une déformation, il faut bien sûr que les proportions de l'image finale soient les mêmes que celle du plan image, c'est-à-dire :

6. Lancer de rayons

Voyons les transformations utilisées dans l'algorithme du lancer de rayon.

Les objets et la caméra sont positionnés dans l'espace avec la matrice de modélisation-visualisation VM.

Chaque point du plan image se calcule en lancant un rayon issu du centre optique vers ce point. Soit (x'',y'') les coordonnées réduites d'un point du plan image, dans l'intervalle [-1,1]. Les coordonnées du point sont :

Le rayon initial est défini par le point A=O et par le vecteur directeur unitaire , dont les composantes sont :

L'algorithme du lancer de rayon consiste à rechercher le point d'intersection de ce rayon avec l'objet le plus proche. Pour chaque objet, il faut obtenir les coordonnées du point initial et du vecteur dans le repère propre de cet objet. Cela se fait en utilisant la transformation (VM)-1. Pour transformer les composantes du vecteur directeur, il suffit de prendre une quatrième composante nulle.

Notons B le point d'intersection le plus proche et le vecteur directeur d'un rayon émis à partir de ce point (rayon réfracté ou rayon réfléchi). Les coordonnées de ce point et de ce vecteur sont tout d'abord obtenues dans le repère propre de l'objet. Il faut donc les transformer avec la matrice VM pour obtenir les coordonnées dans le repère de la caméra. Pour définir le vecteur directeur d'un rayon lancé vers une source de lumière, il faut d'abord transformer les coordonnées du point B et de la normale à la surface en ce point. La transformation des normales est expliquée dans Transformations affines. Le calcul de l'éclairement d'un point d'une surface, qui fait intervenir les angles entre les rayons et la normale, se fait dans le repère de la caméra.

rayons.svgFigure pleine page
Creative Commons LicenseTextes et figures sont mis à disposition sous contrat Creative Commons.