Maths pour le rendu 3D — 00 — Points, vecteurs et normales

Les trois briques de toute la 3D : le point (une position), le vecteur (une direction et une longueur) et la normale (la perpendiculaire à une surface). Pourquoi on les confond dans le code, et pourquoi il ne faut pas les confondre dans la tête.

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

Réservez un audit gratuit de 30 minutes. Je vous montre concrètement ce qu'on peut automatiser.