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 :
On normalise ensuite ces trois derniers vecteurs :
A noter que l’on peut retrouver un vecteur connaissant les deux autres. Par exemple, l’on veut retrouver le vecteur connaissant
et
. On procède ainsi :
Maintenant pour construire notre Billboard il nous faudra créer une matrice de rotation . 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 de la façon suivante :
C’est-à-dire de manière plus détaillée :
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 :
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




