Transformations de visualisation et autres
Par Xavier Michelon


 
 
Les transformations de projection :

Dernier point technique que nous aborderons avant de nous consacrer à l'étude d'un exemple concret, les transformations de projection correspondent au passage de la scène 3D à une image 2D affichable à l’écran. Comme je l'ai dit la dernière fois, il existe un matrice pour stocker les transformations de projection qu'on peut activer en appelant glMatrixMode(GL_PROJECTION). Il existe différents types de projections. L'ouvrage de Foley et Van Dam cité en référence à la fin du didacticiel détaille bon nombre de méthodes de projection. Comme les projections sont stockées dans des matrices et vu qu'il est possible de spécifier une matrice en explicitant chacun de ces coefficients (avec la fonction glLoadMatrix()), vous pourrez utiliser n'importe type de projection. Mais OpenGL vous fournit des fonctions permettant de spécifier simplement les matrices des deux types de projection les plus fréquents (la projection orthogonale et la projection perspective),tout en gérant le problème du fenêtrage.

Le fenêtrage :

Lorsque vous observez une scène 3D, il est possible qu'un certain nombre d'objets se situent hors du champs de vision (derrière la caméra par exemple). Le fenêtrage (clipping en anglais) consiste à déterminer à l’avance les objets de la scène qui se situent hors du champs de la caméra. Pour cela, on définit un volume de vue : tous les objets se situant à l'intérieur du volume seront affichés à l'écran, les objets situés à l'extérieurs du volume seront ignorés. Si un objet est partiellement inclus dans le volume, il sera tronqué, et seul la partie située à l'intérieur du volume sera affichée.

La projection perspective :

Aujourd’hui, nous n’étudierons que la projection perspective. la projection orthogonale sera abordé dans un futur didacticiel concernant la réalisation d’un mini-modeleur 3D. OpenGL fournit deux fonctions pour spécifier une projection perspective. La plus simple (et la seule que nous verrons aujourd'hui)  se nomme gluPerspective, et a le prototype suivant :

void gluPerspective(GLdouble cdv,GLdouble rapport,GLdouble devant,GLdouble derriere);  

Les paramètres de gluPerspective() permettent de définir le volume de vue associé à la projection perpective. La signification de chacun des paramètres est expliquée sur la figure 1, excepté ‘rapport’, qui correspond au rapport largeur/hauteur de l'image. Jusqu'à présent, nous avons toujours travaillé avec des images carrées, donc pour éviter les distorsions, il nous faut choisir un rapport de 1.

Figure 1 : pyramide correspondant au volume de vision en projection perpective

 

De manière standard, la définition d'une méthode de projection pour un scène se fait de la manière suivante :

glMatrixMode(GL_PROJECTION); /* on rend active la matrice de projection */
 glLoadIdentity(); /* on reinitialise la matrice de projection */
 glOrtho(...) /* ou gluPerspective() ou glFrustum(), pour déterminer le type de  projection voulu */
 glMatrixMode(GL_MODELVIEW); /* retour à la matrice de modélisation-visualisation  */ 

A l'instar des transformations géométriques, les fonctions de projection ont pour effet de multiplier à droite la matrice active par une matrice correspondant au type de projection voulu. Il faut donc penser à réinitialiser la matrice avec glLoadIdentity() avant de spécifier la projection.