Calculer la tangente et la bitangente d’une face

NTBFromUVs_cadre

Intro :

Pour certains algorithmes de rendu 3D par shader (comme celui du normal mapping) nous avons besoin, en plus de la normale, de deux vecteurs perpendiculaires à celle-ci : ce sont la tangente et la bitangente (ou binormale).

Voici trois méthode pour les obtenir et les calculer.

Explications :

Mathématiquement, le calcul de ces deux autres composantes autres que la normale s’énonce ainsi :

\(\vec{Edge1} = \vec{V}_2 – \vec{V}_1 \)

\(\vec{Edge2} = \vec{V}_3 – \vec{V}_1 \)

\(\vec{UVEdge1} = \vec{UV}_2 – \vec{UV}_1 \)

\(\vec{UVEdge2} = \vec{UV}_3 – \vec{UV}_1 \)

\(p = (\vec{UVEdge1}_y * \vec{UVEdge2}_x)\, – \,(\vec{UVEdge1}_x * \vec{UVEdge2}_y) \)

\(c = 1 / p \)

\(\vec{Tangent} = [\enspace (\vec{Edge1} * -\vec{UVEdge2}_y) + (\vec{Edge2} * \vec{UVEdge1}_y) \enspace ]\newline * c \)

\(\vec{Bitangent} = [\enspace(\vec{Edge1} * -\vec{UVEdge2}_x) + (\vec{Edge2} * \vec{UVEdge1}_x)\enspace] * c \)

Je vous montre une fonction permettant de calculer la tangente et la bitangente.

Un autre algorithme est disponible si vous ne voulez pas calculer les données face par face !

Voici la troisième fonction (sans doute la meilleure) :

Voilà c’est tout pour les algorithmes !

Sachez que comme vous l’avez vu, la méthode standard indique que la tangente doit être orientée dans la même direction que les coordonnées de texture du triangle en question.

D’autre part ce n’est pas l’objet de cet article, mais je vous apprend que la normale, la binormale et la tangente sont trois vecteurs qui forment une base permettant de transformer les normales issues (et extraites) d’une image RGB spéciale VERS l’espace / coordonnées du modèle du mesh contenant les triangles (bind space ou model space en anglais).

Cette base est représentée mathématiquement par la matrice suivante :

\(\begin{bmatrix} \textbf{T}_x & \textbf{B}_x & \textbf{N}_x \\ \textbf{T}_y & \textbf{B}_y & \textbf{N}_y \\ \textbf{T}_z & \textbf{B}_z & \textbf{N}_z \end{bmatrix} \)

\(\textbf{T} \) représentant la tangente. \(\textbf{B} \) représentant la binormale. \(\textbf{N} \) représentant la normale.

Il ne reste plus qu’à multiplier le vecteur normal par cette matrice est le tour est joué !

Résumé :

Nous avons présenté l’algorithme permettant de calculer les binormales et les bitangentes en utilisant les coordonnées des textures du mesh en question.

Références :

– http://www.3dkingdoms.com/weekly/weekly.php?a=37

– http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-13-normal-mapping/