Intro :
La normale est un vecteur perpendiculaire à un triangle ou une face quelconque.
Prérequis :
– Savoir ce qu’est un vecteur et les opérations algébriques associées.
Explications :
La normale décrit dans quelle direction une face est dirigée. La normale est un vecteur d’unité 1, puisqu’il a été normalisé. Elle est perpendiculaire à tous les points de la face.
Comment calculer la normale ?
On cherche à trouver deux vecteurs d’une face donnée en prenant le produit vectoriel de ces deux là.
Pour trouver la normale d’un triangle \(\Delta\vec{p_0}\vec{p_1}\vec{p_2} \), on calcule ces deux vecteurs d’arrêtes (côtés) du triangle.
\(\vec{u} = \vec{p_1} – \vec{p_2} \)
\(\vec{v} = \vec{p_2} – \vec{p_0} \)
\(\vec{n} = (\vec{u}\times\vec{v}) / \|\vec{u}\times\vec{v}\| \)
Voici l’algorithme en C++ :
|
1 2 3 4 5 6 7 8 9 10 |
#include <d3dx10math.h> void ComputeNormal(D3DXVECTOR3* p0, D3DXVECTOR3* p1, D3DXVECTOR3* p2, D3DXVECTOR3* out) { D3DXVECTOR3 u = *p1 - *p0; D3DXVECTOR3 v = *p2 - *p0; D3DXVec3Cross(out, &u, &v); D3DXVec3Normalize(out, out); } |
On peut la calculer autrement :
\(n_{x} = u_{y}v_{z} – u_{z}v_{y} \)
\(n_{y} = u_{z}v_{x} – u_{x}v_{z} \)
\(n_{z} = u_{x}v_{y} – u_{y}v_{x} \)
Comment la normaliser ?
\({\vec{v}}_{norm}=\frac{{\vec{n}}}{\|{\vec{n}}\|} \)
Voici l’algorithme en C++ :
|
1 2 3 4 5 6 7 8 |
#include <d3dx10math.h> void Normalize(D3DXVECTOR3& v) { unsigned int iLength = sqrt((v.x * v.x) + (v.y * v.y) + (v.z * v.z)); v.x /= iLength; v.y /= iLength; v.z /= iLength; } |
A quoi sert la normale ?
La normale est utilisée dans le calcul de la nuance de lumière d’une face en utilisant la loi de Lambert. De cette façon nous pouvons déterminer l’angle à laquelle la lumière frappe un vertex.
Elle est aussi utilisée dans le rendu du « Bump Mapping ».
Transformation de la normale par une mise à l’échelle non uniforme :
On doit faire attention aux vecteurs normales lorsqu’on fait une opération d’agrandissement (de mise à l’échelle / de scaling) autre que d’unité 1 ou non-uniforme.
[schéma / dessin]
La normale est correctement transformée avec la matrice de transformation d’agrandissement inversée et transposée.
Résumé :
Nous avons présenté le vecteur normal ; entité mathématique qui sert notamment à effectuer le calcul lumineux d’un modèle.
Références :
– https://www.opengl.org/wiki/Calculating_a_Surface_Normal


