# Backface culling ## Introduction Il y a plusieurs façons de représenter un objet 3D sur un ordinateur. La plus courante consiste à modéliser les objets sous forme de polyhèdres 3D décrits par un maillage polygonal, en général fait de triangles ou de quadrilatères. ![](https://i.imgur.com/JQK6psa.png) Fig. Un exemple de deux maillages triangulaires. Dessiner à l'écran un objet 3D vu depuis un point de vue donné localisé dans l'espace 3D (qu'on appele caméra) revient à dessiner chaque polygone de son maillage. Mais certains de ces polygones peuvent ne pas être visibles depuis la caméra, soit (1) s'ils ne font pas face à la caméra, (2) s'ils sont cachés par un autre objet, (3) s'ils sont hors du champs de vision ou encore (4) s'ils sont trop petits. Le backface culling désigne une technique qui résout le premier point en éliminant - en ne dessinant pas, donc - les polygones qui sont "dos" à la caméra. ## Orientation d'un triangle Pour l'exemple on va prendre une pyramide (un tétraèdre), composée de 4 triangles. A et B sont visibles, C le triangle de "dessous" et D le triangle "arrière" sont cachés : ![](https://i.imgur.com/hi6tuOc.png =300x) Plus précisément, on va considérer uniquement le triangle A. Ce triangle nous fait-il face ? Difficile à dire si on considère qu'un triangle dans un espace 3D a deux "cotés", comme une feuille de papier. Mais, justement, en 3D numérique on considère que le triangle n'a qu'une seule face et donc qu'une seule orientation. Reste donc à savoir comment on choisit le coté à conserver, qui soit toujours le même quelque soit le triangle. On commence par numéroter les sommets du triangle, toujours dans le même sens. Par convention on utilise le **sens horaire**. ![](https://i.imgur.com/bW2iAPX.png =200x) Ensuite, on construit deux vecteurs à partir de deux cotés du triangle. Les vecteurs doivent être dans le "sens" de la numérotation des points. Par exemple avec un vecteur $u=p_1p_2$ et $v=p_2p_3$: ![](https://i.imgur.com/gb1CZpV.png =200x) Puis on calcule le [produit vectoriel](https://fr.wikipedia.org/wiki/Produit_vectoriel) de $u$ et $v$. Sans entrer dans les détails, le produit vectoriel de 2 vecteurs 3D crée un troisième vecteur 3D qui a deux propriétés : - il est **orthogonal** aux deux vecteurs, c'est à dire perpendiculaire à la face du triangle - il est toujours dirigé selon la ["règle de la main droite"](https://fr.wikipedia.org/wiki/R%C3%A8gle_de_la_main_droite). Dans notre cas, ça donne le vecteur $n$ : ![](https://i.imgur.com/ZdKAdPa.png =400x) Ce vecteur $n$ est le **vecteur normal à la surface du triangle**, aussi appelé simplement "normale à la surface". **Remarque** : si on avait appliqué exactement la même procédure mais en numérotant les sommets dans le sens anti-horaire, la normale aurait été orientée dans le sens opposé. D'où l'importance cruciale de choisir un ordre de numérotation et de s'y tenir ! ## Faire face à la caméra Une fois que l'on a calculé la normale à la surface du triangle, encore faut il savoir si ce triangle fait face à la caméra. Pour cela, on commence par tracer un vecteur $w$ qui part de la caméra et qui est dirigé vers le triangle. ![](https://i.imgur.com/SzumPwf.png =400x) Pour cela on calcule le produit scalaire de $n$ et $w$ noté $n \cdot w$. Le produit scalaire est une opération s'applique à deux vecteurs et fournit un nombre : - si ce nombre est égal à 0, les deux vecteurs sont perpendiculaires; - s'il est positif, l'angle entre les deux vecteurs est inférieur à 90°; - s'il est négatif, l'angle entre les deux vecteurs est supérieur à 90°; Si le produit scalaire $n \cdot w$ est négatif, cela signifie que la normale au triangle est dans le sens "opposé" au vecteur $w$, et donc que le triangle A fait "face" à la caméra. **Donc, il suffit d'éliminer le triangle si le résultat du produit scalaire entre sa normale et le vecteur $w$ est positif ou nul !**