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 :

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