DirectX Managed : Rappel des concepts de bases

Rappel des concepts de bases

Par Guillaume Randon, Microsoft Service

Cette série d’articles a pour but de présenter la technologie DirectX et la façon dont elle peut être utilisée à partir d’un langage du Framework .Net comme C# au travers de la réalisation complète d’un petit jeu. Le jeu est assez limité gageons qu’il n’a pas une durée de vie extraordinaire mais il permet d’illustrer les notions de bases nécessaire pour réaliser une application 3D interactive.

Même si des rappels sont effectués au début de ce document, il est nécessaire de posséder au préalable des notions de géométrie Euclidienne et de programmation orientée objet. Ce document n’est pas non plus destiné à des utilisateurs de la technologie DirectX qui souhaiteraient approfondir leurs connaissances. Il s’adresse à des lecteurs ayant les notions mathématiques et de programmation que nous venons d’indiquer et qui souhaiteraient pouvoir se lancer rapidement dans l’utilisation de cette API graphique.

Sur cette page

Espace en 3 dimensions
Objets en 3 dimensions
Matrices 4x4
Transformations importantes

Espace en 3 dimensions

Avec DirectX il est d’usage d’utiliser une base avec l’axe des X pointant vers la droite, l’axe des y pointant vers le haut et l’axe de Z pointant vers l’infini.

Tout point de l’espace peut être repéré par ses coordonnées selon ces trois axes. Par exemple l’origine de l’espace (0,0,0).

Nous appellerons l’espace en 3 dimensions dans lequel nous allons positionner tous nos objets l’espace de référence. A chaque objet de l’espace il est possible d’associer une base que nous qualifierons de locale, ayant sa propre position et orientation dans l’espace de référence. Un point d’un objet peut être défini par ses coordonnées exprimées par rapport à la base locale ou par rapport à la base de l’espace de référence.

Objets en 3 dimensions

La pluparts des objets que nous allons afficher et manipuler dans notre espace de points sont définis par un ensemble de points souvent reliés entre eux pour former un ensemble de triangle.

Bb736729.tutoriel3(fr-fr,MSDN.10).jpg

Souvent la position dans l’espace des points en question est connue par rapport à une base locale à l’objet. En effet la pluparts du temps les géométries en question sont crées une par une et indépendamment les unes des autres à l’aide d’outils appelés modeleurs. Les objets sont ensuite positionnés dans notre espace en 3 dimensions à l’aide de la position et de l’orientation de leur base locale. Ce paramètre est passé à la carte graphique sous la forme d’une matrice 4x4.

Matrices 4x4

La pluparts du temps les positions des points étant initialement connus par rapport à la base locale, une partie du travail effectué par DirectX (avec l’aide de la carte graphique) est de calculer la position de ces points dans l’espace de référence à partir de leur position exprimée par rapport à une base locale.

Ces transformations applicables sur notre espace en 3 dimensions peuvent être exprimées sous forme de matrices 4x4. De fait la position et l’orientation d’une base locale à un objet peuvent être exprimées sous cette forme. Ces notions de position et d’orientation de la base locale sont souvent confondues avec la position et l’orientation de l’objet en lui-même. Dans la documentation du SDK DirectX et de façon plus générale dans la littérature anglaise traitant de graphismes en 3D, il est d’usage d’appeler cette matrice 4x4 la ‘World Matrix’ associée à l’objet.

Bb736729.tutoriel4(fr-fr,MSDN.10).jpg

x’ = (x.M11 + y.M21 + z.M32 + M41)/(M14+M24+M34+M44)
y’ = (x.M12 + y.M22 + z.M32 + M42)/(M14+M24+M34+M44)
z’ = (x.M13 + y.M23 + z.M33 + M43)/(M14+M24+M34+M44)

Il est aussi intéressant de savoir comment sont construites les matrices correspondantes aux translations, dimensionnements, et rotations. Managed DirectX contient une structure Matrix disposant de méthodes qui permettent de construire automatiquement ces matrices.

MATRICES DE TRANSLATION
Bb736729.tutoriel5(fr-fr,MSDN.10).jpg
MATRICES DE CHANGEMENT DE TAILLE
Bb736729.tutoriel6(fr-fr,MSDN.10).gif
MATRICES DE ROTATION

Rotation autour de l’axe des x :
Bb736729.tutoriel7(fr-fr,MSDN.10).jpg
Rotation autour de l’axe des y :
Bb736729.tutoriel8(fr-fr,MSDN.10).jpg
Rotation autour de l’axe z 
Bb736729.tutoriel9(fr-fr,MSDN.10).jpg

Transformations importantes

Il existe trois transformations de notre espace en 3 dimensions qui vont être effectuées pour calculer l’image en deux dimensions le représentant.

World Transform

Pour chaque objet une première transformation pour exprimer tous ses points par rapport à la base de notre espace de référence. La World Matrix associée à l’objet est utilisée pour effectuer cette transformation. Dans la littérature anglo-saxonne cette transformation est appelée World Transform.

Bb736729.tutoriel10(fr-fr,MSDN.10).jpg

Pour chaque point (vertex) la transformation suivante est effectuée : (xref, yref, zref, 1) = (xlocal, ylocal, zlocal, 1) * WorldMat.

View Transform

Une fois chaque point d’un objet positionné dans l’espace de référence, il est nécessaire de le positionner dans l’espace associé à la caméra. Celle-ci peut être positionnée ailleurs qu’à l’origine de l’espace de référence, c’est d’ailleurs le cas la pluparts du temps, et elle n’est pas forcément orientée selon la base de l’espace de référence. On utilise pour effectuer cette transformation la ‘View Matrix’ associée à la caméra. Cette matrice est différente de la ‘World Matrix’ qui pourrait être associée à cette même caméra.

La view matrix peut être exprimée comme résultant de trois rotations et d’une translation : V = T * Rx * Ry * Rz.

Si par exemple la caméra est positionnée en (10, 20, 10) (on aurait donc : WorldMat.M41 = 10, WorldMat.M42 = 20, WorldMat.M43= 10), pour repositionner un point de l’espace de référence dans l’espace de la caméra, la matrice associé à la translation T aura les propriétés suivante T.M41 = -10, T.M42 = -20, T.M43 = -10. En imaginant que la caméra ait la même orientation que la base de notre espace de référence, on aura pour Rx, Ry et Rz la matrice identité et donc V = T, on voit bien dans ce cas précis que V et la WorldMat sont différentes.

Projection Transform

Outre sa position et son orientation dont résulte la ‘view matrix’, dans toutes les API graphiques, la caméra se voit associer des propriétés supplémentaires qui défissent un plan perpendiculaire à la direction du regard avant lequel on ne souhaite rien visualiser, et un autre plan au-delà duquel on ne souhaite plus prendre en compte des objets de l’espace pour l’affichage. Puis des propriétés qui définissent l’angle d’ouverture horizontal et l’angle d’ouverture vertical de la caméra. Ces quatre valeurs supplémentaires sont appelées en anglais respectivement, near plane, far plane, Field Of View x (fovx) et Field of View y (fovy). Ils définissent une pyramide à base tronquée qui contient tout l’espace qui va être effectivement affiché.

Avant de calculer la couleur en chaque point de nos géométries une dernière transformation va être appliquée à notre espace en trois dimensions pour transformer cette pyramide tronquée en un cube. On peut imaginer que la face arrière de notre cube est notre surface de rendu ou notre écran. Cela présente un intérêt lors du calcul final de la couleur de chaque pixel à l’écran. Si nous projetions directement nos géométries sur le plan correspondant à la surface de rendu nous ne pourrions pas savoir quel est objet est devant un autre et finalement apparaitrait à l’écran le dernier objet projeté sur le plan. Passer du viewing frustrum au cube permet de préparer cette projection sur un plan tout en conservant des informations sur la distance d’un point d’un objet à la caméra. Intuitivement on passe notre cube sous une presse appuyant sur le ‘near plane’ en direction du ‘far plane’et la couleur qui apparaît au final est celle des morceaux de géométrie qui se trouvait le plus proche de l’observateur.

Bb736729.tutoriel11(fr-fr,MSDN.10).jpg