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 :
En effet, cette matrice est construite à partir de trois vecteurs :
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 :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
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 :
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





