00 — Points, vecteurs et normales
Ce que tu vas apprendre
- La différence entre un point, un vecteur et une normale (et pourquoi elle compte)
- Ce qu'est la normalisation d'un vecteur
- Pourquoi le code les range souvent dans une seule classe
Vec3 - Le plan de la série
Prérequis
- Aucun. Quelques souvenirs de géométrie suffisent.
- Cette série prolonge le parcours rendu commencé avec Ray tracing — les fondations, mais se lit indépendamment.
Dès qu'on programme de la 3D, on manipule trois objets sans arrêt : des points, des vecteurs et des normales. Ils s'écrivent tous les trois pareil — trois nombres — et c'est précisément le piège. Ils ne se transforment pas de la même façon, et confondre les trois est l'une des sources d'erreurs les plus tenaces du rendu. Comprendre leur différence, c'est, selon Scratchapixel, environ 80 % du bagage géométrique nécessaire pour faire de l'infographie. On commence par là.
Un point : une position
Un point est une position dans l'espace, rien de plus. Il répond à la question « où ? ». On le note avec trois coordonnées :
P = (x, y, z)
Un point n'a ni direction ni longueur. C'est une épingle plantée sur une carte. Déplacer un point a un sens (il change d'endroit) ; lui « ajouter une longueur » ou « le tourner » sur place n'en a pas directement.
Un vecteur : une direction et une longueur
Un vecteur porte deux informations à la fois : une direction et une magnitude (sa longueur). Visualise une flèche partant d'une origine vers une extrémité : elle dit « par là, et sur cette distance ». On le note exactement comme un point — d'où la confusion :
V = (x, y, z)
Mais sa nature est différente. Un vecteur n'a pas de position : la même flèche, déplacée n'importe où dans l'espace sans changer ni sa direction ni sa longueur, reste le même vecteur. C'est pour ça qu'on translate un point mais jamais un vecteur — on y reviendra à l'article sur les transformations.
En maths, un vecteur peut avoir un nombre quelconque de dimensions. En infographie, on se restreint presque toujours à trois (parfois deux ou quatre), parce qu'on décrit l'espace.
La longueur et la normalisation
La longueur (ou norme) d'un vecteur mesure de combien il avance dans sa direction :
‖V‖ = √(V.x² + V.y² + V.z²)
Très souvent, on ne veut garder que la direction, sans la longueur. On normalise alors le vecteur : on le divise par sa propre longueur pour obtenir un vecteur de longueur exactement 1 (un « vecteur unitaire »).
V̂ = V / ‖V‖ → ‖V̂‖ = 1
Astuce de perf classique : diviser coûte cher, alors on calcule une fois 1/‖V‖ et on multiplie les trois composantes par cet inverse. Attention quand même — un vecteur nul n'a pas de direction, et le normaliser revient à diviser par zéro. La normalisation est une source de bugs sournois ; vérifie toujours qu'un vecteur a besoin (ou non) d'être unitaire.
Une normale : la perpendiculaire à une surface
Une normale est le vecteur perpendiculaire à une surface en un point donné. Elle indique « vers où regarde » la surface à cet endroit. C'est l'information clé de tout l'éclairage : l'angle entre la normale et la lumière décide de la quantité de lumière reçue (on l'a vu dans la série ray tracing).
Une normale ressemble à un vecteur — direction et longueur — mais elle se transforme différemment, et c'est l'un des pièges les plus contre-intuitifs de la 3D. Un article entier de cette série y est consacré (Transformer les normales).
Pourquoi le code mélange les trois
Dans la vraie vie, on n'écrit pas trois classes séparées. La plupart des moteurs utilisent une seule classe générique, souvent appelée Vec3, pour les points, les vecteurs et les normales :
cpptemplate<typename T>
class Vec3 {
public:
Vec3() : x(0), y(0), z(0) {}
Vec3(T xx) : x(xx), y(xx), z(xx) {}
Vec3(T xx, T yy, T zz) : x(xx), y(yy), z(zz) {}
T x, y, z;
};
typedef Vec3<float> Vec3f;
C'est le choix de bibliothèques sérieuses comme OpenEXR. L'avantage est la simplicité ; le prix à payer est qu'on perd la distinction sémantique. Le compilateur ne t'empêchera pas de translater une normale (ce qui est faux). La discipline est dans ta tête, pas dans le type. Garder en mémoire « ceci est un point / un vecteur / une normale » est la vraie compétence.
Le plan de la série
| Article | Contenu |
|---|---|
| 00 — Points, vecteurs, normales | Les trois briques (cet article) |
| 01 — Systèmes de coordonnées | Repères, origine, main droite/gauche |
| 02 — Produit scalaire et vectoriel | Les deux produits qui font tout |
| 03 — Les matrices | Encoder une transformation |
| 04 — Transformer points et vecteurs | Coordonnées homogènes, 4×4 |
| 05 — Row-major vs column-major | La convention qui sème la zizanie |
| 06 — Coordonnées sphériques et repères locaux | Angles, et fabriquer un repère |
| 07 — Transformer les normales | L'inverse-transposée |
| 08 — Inverser une matrice | La méthode de Gauss-Jordan |
| 09 — Interpolation | Lerp, interpolation bilinéaire |
| 10 — Placer une caméra : LookAt | De « regarde là » à une matrice |
| 11 — Glossaire | Tout le vocabulaire |
L'article suivant pose le décor de tous ces nombres : le système de coordonnées, sans lequel « (x, y, z) » ne veut rien dire.
Sources
- Scratchapixel. Geometry — Points, Vectors and Normals. scratchapixel.com
- Marschner, S., & Shirley, P. (2021). Fundamentals of Computer Graphics (5ᵉ éd.), chap. « Vectors ». CRC Press.
- Sanderson, G. (3Blue1Brown). Essence of Linear Algebra — la série vidéo qui donne l'intuition des vecteurs. 3blue1brown.com