Comment calculer la matrice de rotation d’un Billboard

tag

Intro :

Qu’est-ce un billboard ? Un billboard est un objet 3D (en général d’apparence 2D) qui fait toujours face à la caméra.

Prérequis :

– Savoir ce qu’est une matrice

– Savoir lire une matrice

– Savoir en quoi consiste la matrice de vue

Explications :

Rappelez vous que la matrice de vue (celle de la caméra) est définie ainsi :

viewmatrix

En effet, cette matrice est construite à partir de trois vecteurs :

uprightlook

Avec une origine (ainsi nommée « Caméra ») représentant la position de celle-ci par rapport au repère commun à tous les nœuds de la scène, cette dernière concerne la matrice World (matrice de monde)

Une fois construite, la matrice de vue est une matrice qui doit être mise à jour constamment dans la boucle de rendu.

Décomposition de la matrice View :

\vec{LookAt}_x = \textbf{View}_{02}
\vec{LookAt}_y = \textbf{View}_{12}
\vec{LookAt}_y = \textbf{View}_{22}

\vec{Right}_x = \textbf{View}_{00}
\vec{Right}_y = \textbf{View}_{10}
\vec{Right}_y = \textbf{View}_{20}

\vec{Up}_x = \textbf{View}_{01}
\vec{Up}_y = \textbf{View}_{11}
\vec{Up}_y = \textbf{View}_{21}

 

On normalise ensuite ces trois derniers vecteurs :

{\vec{LookAt}}_{norm}=\frac{{\vec{LookAt}}}{\|{\vec{LookAt}}\|}
{\vec{Right}}_{norm}=\frac{{\vec{Right}}}{\|{\vec{Right}}\|}
{\vec{Up}}_{norm}=\frac{{\vec{Up}}}{\|{\vec{Up}}\|}

 

A noter que l’on peut retrouver un vecteur connaissant les deux autres. Par exemple, l’on veut retrouver le vecteur {\vec{Up}} connaissant {\vec{Right}} et {\vec{LookAt}} . On procède ainsi  :

{\vec{Up}} = {\vec{LookAt}}\times{\vec{Right}}

 

Maintenant pour construire notre Billboard il nous faudra créer une matrice de rotation \textbf{R} . C’est avec cette matrice de rotation que seront multipliés toutes les vertices du Billboard de façon à ce qu’ils soient toujours en face de la caméra !

On calcule la matrice \textbf{R} de la façon suivante :

\textbf{R}_{0*} = {\vec{Right}}
\textbf{R}_{1*} = {\vec{Up}}
\textbf{R}_{2*} = {\vec{LookAt}}

 

C’est-à-dire de manière plus détaillée :

\textbf{R}_{01} = \vec{Right_x}
\textbf{R}_{02} = \vec{Right_y}
\textbf{R}_{03} = \vec{Right_z}

\textbf{R}_{11} = \vec{Up_x}
\textbf{R}_{12} = \vec{Up_y}
\textbf{R}_{13} = \vec{Up_z}

\textbf{R}_{21} = \vec{LookAt_x}
\textbf{R}_{22} = \vec{LookAt_y}
\textbf{R}_{23} = \vec{LookAt_z}

 

Voici le Vertex Shader qui applique le calcul en question :

PS_INPUT VS(VS_INPUT input)
{
    PS_INPUT output = (PS_INPUT)0;
    
    // Extraction du LookAt vector
    float3 look;
    look.x = View[0][2];
    look.y = View[1][2];
    look.z = View[2][2];
    look = normalize(look);    

    // Extraction du Right vector
    float3 right;
    right.x = View[0][0];
    right.y = View[1][0];
    right.z = View[2][0];
    right = normalize(right);
    
    // Détermination du Up vector
    float3 up = cross(look, right);
    up = normalize(up);

    // Matrice de rotation qui fait face à la caméra
    float3x3 R;
    R[0] = right;
    R[1] = up;
    R[2] = look;
    
    float3 posW = mul(input.Pos, R);

    output.Pos = mul( float4(posW, 1.0f), World );
    output.Pos = mul( output.Pos, View );
    output.Pos = mul( output.Pos, Projection );
    
    output.Color = input.Color;    
    output.Page = input.Page;    
    output.Tex = input.Tex;        
    
    return output;
}

 

Voici un Billboard affiché qui représente une quête disponible :

 

billboard

 

Résumé :

Nous avons expliqué comment créer un Billboard en construisant une matrice de rotation spéciale qui tourne et qui fait toujours face à la caméra.

Références :

– Des sujets issus de quelques forums Internet comme celui de www.gamedev.net

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *