Génération de terrain (2/2)
Par Xavier Michelon


 
   
Les normales

Nous avons déjà parlé à plusieurs reprises des normales. Nous avons vu qu'un vecteur normal est affecté à chaque sommet par un système de variables d'état : on définit le vecteur normal courant grâce à glNormal(), et lors de la description d'un polygone, les sommets se voient affectés comme normale le vecteur normal courant. Pour obtenir un rendu correct, le vecteur normal doit être perpendiculaire à la surface de l'objet, et sa longueur doit valoir 1.

Jusqu'à présent, nous avons toujours évité les problèmes liés aux normales, soit en utilisant des fonctions glut qui se chargent elles-mêmes de générer des normales correctes, soit en travaillant avec des objets 3D pour lesquels les normales sont évidentes (notre bon vieux cube par exemple). Aujourd'hui, il en va tout autrement : les normales de notre terrain ne sont pas  simples à calculer !


Calcul des normales

Il est en général difficile de calculer la normale d'un objet en un point donné. Le problème vient du fait que calculer un vecteur normal à un point n'a pas de sens, on calcule un vecteur normal à une surface en un point donné. Et nous n'avons pas une description parfaite de la surface, nous n'avons qu'une approximation polygonale. En fait, cela nous arrange : nos polygones sont plans ( nous nous en sommes assurés la derniere fois en utilisant le triangle comme primitive de base), et donc, chaque point d'un polygone a le même vecteur normal ! Donc finalement, pour calculer la normale en un sommet de la surface, il suffit de calculer une normale pour chacun des polygones auquel appartient le sommet, puis de faire la moyenne de tous ces vecteurs pour obtenir notre normale tant désirée !!!

Reste maintenant à savoir comment calculer un vecteur normal à un polygone : rien de plus simple avec le produit vectoriel.


Le produit vectoriel

Le produit vectoriel est un opérateur mathématique relativement utile en infographie, tout comme son compère le produit scalaire. Le principe du produit vectoriel est simple : le produit vectoriel de deux vecteurs u et v non colinéaires renvoie un vecteur perpendiculaire au plan défini par les vecteurs u et v. Si u et v ont pour composantes respectives (x1,y1,z1) et (x2,y2,z2), alors le produit vectoriel de u et v, noté u^v a pour composantes : (y1*z2-y2*z1 , z1*x2-z2*x1 , x1*y2-x2*y1). Le produit vectoriel possède certaines particularités : une des plus importantes pour nous est que u^v = - (v^u). Il faut donc faire attention a l'ordre dans lequel vous effectuez le produit scalaire, au risque de vous retrouver avec des normales inversées.

Connaissant les sommets d'un polygone, on obtient facilement deux vecteurs appartenant au plan dans lequel est inscrit le polygone : il suffit de prendre 3 sommets P1,P2,P3 et de considérer les vecteurs P1P2 et P1P3. Attention, il faut vous assurer que les deux vecteurs ne sont pas colinéaires et qu'aucun de ces deux vecteurs n'est nul, sinon le produit vectoriel vous renverra un vecteur nul. Dans le cas de notre terrain nous n'auront pas de problème, puisque nous utilisons un maillage régulier. Pour les moins matheux d'entre vous, je me permet de signaler que le vecteur P1 P2 définit par les deux points P1 (x1,y1,z1) et P2(x2,y2,z2) a pour composantes le triplet (x2-x1 , y2-y1 , z2-z1).