06 — Les maillages polygonaux
Ce que tu vas apprendre
- Ce qu'est un maillage : sommets et faces
- La géométrie indexée, pour ne pas dupliquer les sommets
- La triangulation des faces
- Normales de face contre normales de sommet
Prérequis
- Le triangle et les coordonnées barycentriques
Un objet 3D réaliste — un personnage, une voiture, un arbre — n'est pas une équation, c'est un maillage polygonal : une coquille creuse faite de milliers de petits polygones (presque toujours des triangles) qui en épousent la forme. Comprendre comment on range ces triangles est indispensable avant de pouvoir les ray tracer.
Sommets et faces
Un maillage, c'est deux listes :
- les sommets (vertices) : les points 3D qui définissent la coquille ;
- les faces : les polygones qui relient ces sommets pour former la surface.
un cube : 8 sommets, 6 faces (quads) ou 12 triangles
v4───────v5
/│ /│
v0───────v1 │
│ v7──────│v6
│/ │/
v3───────v2
La géométrie indexée
Une remarque cruciale : dans un maillage, chaque sommet est partagé par plusieurs faces. Sur le cube ci-dessus, le sommet v1 appartient à trois faces. Si on stockait les coordonnées de v1 dans chacune des faces, on les dupliquerait — gaspillage de mémoire, et cauchemar si on veut déplacer le sommet (il faudrait le modifier partout).
La solution est la géométrie indexée : on stocke les sommets une seule fois dans un tableau, et chaque face ne contient que des indices vers ce tableau.
cppstd::vector<Vec3f> vertices; // les sommets, une seule fois
std::vector<int> faceIndices; // 3 indices par triangle
// triangle k : vertices[faceIndices[3k]], [3k+1], [3k+2]
Déplacer un sommet ne touche qu'une entrée ; les faces qui le référencent suivent automatiquement. C'est le format standard, celui qu'utilisent les fichiers .obj, les cartes graphiques (index buffers) et tous les moteurs.
La triangulation
Les modeleurs travaillent souvent en quads (quadrilatères), plus pratiques pour la modélisation. Mais un quad peut être non plan, et l'intersection rayon-triangle, elle, exige des triangles. On triangule donc : chaque face à n côtés est découpée en n − 2 triangles.
un quad → deux triangles
v0───v1 v0───v1
│ │ → │ ╱ │
│ │ │ ╱ │
v3───v2 v3───v2
Une fois triangulé, le maillage n'est plus qu'une grande liste de triangles, tous prêts pour Möller-Trumbore. C'est l'étape qui uniformise toute la géométrie.
Normales de face, normales de sommet
Deux sortes de normales coexistent dans un maillage, et la distinction est essentielle (on l'a entrevue avec l'ombrage lisse).
La normale de face est la perpendiculaire au plan d'un triangle, obtenue par le produit vectoriel de deux de ses côtés. Il y en a une par triangle. Elle décrit l'orientation de la facette plane.
La normale de sommet est attachée à un sommet, et vaut en général la moyenne des normales des faces qui l'entourent, normalisée. Elle approxime la direction de la vraie surface courbe que le maillage imite.
normale de face normales de sommet (moyennées)
↑ ↑ ↑ ↑
___|___ _\_ | _/_
/ \ / \|/ \ (suivent la courbure)
Pour une sphère générée mathématiquement, c'est encore plus simple : la normale d'un sommet est juste la direction du centre vers ce sommet, normalisée. Ce sont ces normales de sommet qu'on interpolera par les coordonnées barycentriques pour obtenir l'ombrage lisse de l'article suivant.
On sait maintenant représenter un objet. L'article suivant le rend : la boucle qui teste chaque triangle et applique l'ombrage doux.
Sources
- Scratchapixel. Ray-Tracing a Polygon Mesh (Part 1). scratchapixel.com
- Scratchapixel. The OBJ File Format (le format de maillage indexé le plus répandu). scratchapixel.com
- Pharr, M., Jakob, W., & Humphreys, G. (2023). Physically Based Rendering (4ᵉ éd.), chap. « Triangle Meshes ». pbr-book.org