Partager via


Transformation de projection (Direct3D 9)

Vous pouvez considérer la transformation de projection comme un contrôle des internes de la caméra; il est analogue au choix d’un objectif pour l’appareil photo. Il s’agit du plus complexe des trois types de transformation. Cette discussion sur la transformation de projection est organisée en rubriques suivantes.

La matrice de projection est généralement une projection d’échelle et de perspective. La transformation de projection convertit le frustum d’affichage en forme cuboïde. Étant donné que l’extrémité proche du frustum d’affichage est plus petite que l’extrémité éloignée, cela a pour effet de développer des objets qui se trouvent près de l’appareil photo; c’est ainsi que la perspective est appliquée à la scène.

Dans le frustum d’affichage, la distance entre la caméra et l’origine de l’espace de transformation d’affichage est définie arbitrairement comme D, de sorte que la matrice de projection ressemble à l’illustration suivante.

illustration de la matrice de projection

La matrice d’affichage traduit l’appareil photo à l’origine en effectuant une traduction dans le sens z par - D. La matrice de traduction est semblable à l’illustration suivante.

illustration de la matrice de traduction

La multiplication de la matrice de traduction par la matrice de projection (T*P) donne la matrice de projection composite, comme illustré dans l’illustration suivante.

illustration de la matrice de projection composite

La transformation de perspective convertit un frustum d’affichage en un nouvel espace de coordonnées. Notez que le frustum devient cuboïde et que l’origine se déplace du coin supérieur droit de la scène vers le centre, comme illustré dans le diagramme suivant.

diagramme de la façon dont la transformation de la perspective transforme le frustum d’affichage en un nouvel espace de coordonnées

Dans la transformation de perspective, les limites des directions x et y sont -1 et 1. Les limites de la direction z sont 0 pour le plan avant et 1 pour le plan arrière.

Cette matrice traduit et met à l’échelle les objets en fonction d’une distance spécifiée entre l’appareil photo et le plan de découpage proche, mais elle ne tient pas compte du champ de vision (fov), et les valeurs z qu’elle produit pour les objets à distance peuvent être presque identiques, ce qui rend les comparaisons de profondeur difficiles. La matrice suivante résout ces problèmes et ajuste les sommets pour tenir compte du rapport d’aspect de la fenêtre d’affichage, ce qui en fait un bon choix pour la projection de perspective.

illustration d’une matrice pour la projection en perspective

Dans cette matrice, Zn est la valeur z du plan de découpage proche. Les variables w, h et Q ont les significations suivantes. Notez que fovw et fovk représentent les champs d’affichage horizontal et vertical de la fenêtre d’affichage, en radians.

équations des significations variables

Pour votre application, l’utilisation d’angles de champ de vue pour définir les coefficients de mise à l’échelle x et y peut ne pas être aussi pratique que d’utiliser les dimensions horizontales et verticales de la fenêtre d’affichage (dans l’espace de la caméra). Au fur et à mesure que les mathématiques fonctionnent, les deux équations suivantes pour w et h utilisent les dimensions de la fenêtre d’affichage et sont équivalentes aux équations précédentes.

équations des significations des variables w et h

Dans ces formules, Zn représente la position du plan de découpage proche, et les variables Vw et Vh représentent la largeur et la hauteur de la fenêtre d’affichage, dans l’espace de la caméra.

Pour une application C++, ces deux dimensions correspondent directement aux membres Width et Height de la structure D3DVIEWPORT9 .

Quelle que soit la formule que vous décidez d’utiliser, veillez à définir Zn sur une valeur aussi grande que possible, car les valeurs z extrêmement proches de l’appareil photo ne varient pas beaucoup. Cela complique quelque peu les comparaisons de profondeur à l’aide de mémoires tampons z 16 bits.

Comme pour les transformations de monde et d’affichage, vous appelez la méthode IDirect3DDevice9::SetTransform pour définir la transformation de projection.

Configuration d’une matrice de projection

L’exemple de fonction ProjectionMatrix suivant définit les plans de découpage avant et arrière, ainsi que le champ horizontal et vertical des angles de vue. Les champs de vue doivent être inférieurs à pi radians.

D3DXMATRIX 
ProjectionMatrix(const float near_plane, // Distance to near clipping 
                                         // plane
                 const float far_plane,  // Distance to far clipping 
                                         // plane
                 const float fov_horiz,  // Horizontal field of view 
                                         // angle, in radians
                 const float fov_vert)   // Vertical field of view 
                                         // angle, in radians
{
    float    h, w, Q;

    w = (float)1/tan(fov_horiz*0.5);  // 1/tan(x) == cot(x)
    h = (float)1/tan(fov_vert*0.5);   // 1/tan(x) == cot(x)
    Q = far_plane/(far_plane - near_plane);

    D3DXMATRIX ret;
    ZeroMemory(&ret, sizeof(ret));

    ret(0, 0) = w;
    ret(1, 1) = h;
    ret(2, 2) = Q;
    ret(3, 2) = -Q*near_plane;
    ret(2, 3) = 1;
    return ret;
}   // End of ProjectionMatrix

Après avoir créé la matrice, définissez-la avec IDirect3DDevice9::SetTransform en spécifiant D3DTS_PROJECTION.

La bibliothèque d’utilitaires D3DX fournit les fonctions suivantes pour vous aider à configurer votre matrice de projection.

Matrice de projection compatible W

Direct3D peut utiliser le composant w d’un sommet qui a été transformé par le monde, les matrices de vue et de projection pour effectuer des calculs basés sur la profondeur dans les effets de mémoire tampon de profondeur ou de brouillard. Les calculs tels que ceux-ci nécessitent que votre matrice de projection normalise w pour qu’elle soit équivalente à l’espace mondial z. En bref, si votre matrice de projection inclut un coefficient (3,4) qui n’est pas 1, vous devez mettre à l’échelle tous les coefficients par l’inverse du coefficient (3,4) pour créer une matrice appropriée. Si vous ne fournissez pas de matrice conforme, les effets de brouillard et la mise en mémoire tampon de profondeur ne sont pas appliqués correctement.

L’illustration suivante montre une matrice de projection non conforme et la même matrice mise à l’échelle de sorte que le brouillard relatif à l’œil soit activé.

illustrations d’une matrice de projection non conforme et d’une matrice avec le brouillard relatif oculaire

Dans les matrices précédentes, toutes les variables sont supposées être différentes de zéro. Pour plus d’informations sur le brouillard relatif à l’œil, consultez Profondeur relative ou Z. Pour plus d’informations sur la mise en mémoire tampon de profondeur basée sur w, consultez Mémoires tampons de profondeur (Direct3D 9).

Direct3D utilise la matrice de projection actuellement définie dans ses calculs de profondeur basés sur w. Par conséquent, les applications doivent définir une matrice de projection conforme pour recevoir les fonctionnalités w souhaitées, même si elles n’utilisent pas Direct3D pour les transformations.

Transformations