Le backface culling
Et un terme barbare, un...
Cette fois, il s’agit de quelque chose qui se fait après la projection, et donc sur base des coordonées écran des points des triangles. Le principe est assez simple, mais il n’est pas toujours d’application. Il consiste à repérer les faces qui nous tournent le dos, et à ne pas les dessiner. Pour des objets comme un cube ou une sphère, c’est évident que les faces qui nous tournent le dos ne sont pas visibles, mais pour des objets plus complexes, ça n’est pas forcément le cas. En général, il faut créer l’objet en se souvenant que seul un côté de la face est visible. Si on veut avoir une face visible des deux côtés, il faut... créer deux faces, l’une sur l’autre, chacune « pointant » dans une direction opposée.
Ou bien explicitement signaler qu’on ne veut pas utiliser le backface culling (ou backface removal, ou supression des faces cachées)
Comment savoir si une face nous tourne le dos ? Il suffit d’avoir dit au mec qui a créé l’objet (ou à l’éditeur, 3dsmax le faisant automatiquement) que toute face doit être définie dans l’ordre horlogique (ou anti-horlogique, l’important c’est que ça soit la même convention tout le temps, bien sûr...). C’est à dire que quand on nous donne les points du triangle, ces points doivent être donnés dans l’ordre suivant :
Et comment qu’on sait si les points sont dans l’ordre horlogique ou pas ? Et bien c’est simple : connaissez-vous un truc qui s’appelle le produit vectoriel ? Je ne vais pas vous retaper la formule parce qu’elle est chiante. La seule astuce ici est de voir que, après tout, les trois points sont dans un même plan (forcément, ils sont sur l’écran...), et que la formule du produit vectoriel, chiante à ses heures, se simplifie fort bien dans cette situation particulière.
Et c’est quoi le produit vectoriel ? Ca permet de trouver un axe dans l’espace, qui est perpendiculaire à deux autres axes, et qui représente par sa norme et sa direction la rotation qu’il faut effectuer pour passer d’un axe à un autre.
Par exemple, si on faisait le produit vectoriel de l’axe 1-2 avec l’axe 1-3 de notre triangle, on obtiendrais un axe qui est perpendiculaire à l’écran, et qui y rentrerait ou en sortirait en fonction du fait... que la rotation à effectuer est positive ou négative. Et donc finalement, la valeur Z du produit vectoriel est positive ou négative en fonction du fait que l’ordre de définition est points est horlogique ou pas. Bingo ! On a notre test pour savoir si une face est face à nous ou pas.
La formule :
va1=x1-x2 vb1=y1-y2 va2=x3-x2 vb2=y3-y2 resultat=va2*vb1-va1*vb2
Resultat est positif ou négatif, en fonction de l’ordre des points. N’affichez les faces qui ont un resultat positif, et si ça ne marche pas, ben n’affichez que les faces qui ont un resultat négatif, comme toujours c’est toujours dur d’arriver du premier coup au première bon résultat =). En toute logique le bon resultat doit être négatif pour être affiché.
Ce test est fortement utilisé, imaginez qu’il permet en moyenne d’éliminer la moitié ( !) des faces avant des les afficher.
On voit à présent pourquoi le clipping devait respecter l’ordre des points...