Maths pour le rendu 3D — 07 — Transformer les normales

Le piège le plus contre-intuitif de la 3D : une normale ne se transforme pas avec la matrice de l'objet. Pourquoi la mise à l'échelle non uniforme casse la perpendicularité, et la solution universelle : l'inverse-transposée.

07 — Transformer les normales

Ce que tu vas apprendre

  • Pourquoi appliquer la matrice de l'objet à sa normale donne un résultat faux
  • Comment la mise à l'échelle non uniforme casse la perpendicularité
  • La solution : transformer les normales par l'inverse-transposée
  • Pourquoi une rotation pure n'a pas ce problème

Prérequis


C'est l'un des bugs les plus vicieux de l'infographie : tu transformes ton objet, tout a l'air correct… sauf l'éclairage, qui devient subtilement faux dès que l'objet est étiré. La cause : tu as transformé les normales comme des vecteurs ordinaires. Or une normale obéit à une règle différente, et la raison est élégante.

Le problème en image

Prends un segment passant par A = (0, 1) et B = (1, 0), avec une normale N = (1, 1) qui lui est perpendiculaire. Applique une mise à l'échelle qui double le x et laisse le y inchangé :

A → A' = (0, 1)
B → B' = (2, 0)
N → N' = (2, 1)   ← si on applique bêtement la même matrice

Le segment A'B' a changé de pente. Si on transforme la normale avec la même matrice, on obtient N' = (2, 1) — qui n'est plus perpendiculaire au segment transformé. La normale s'est mise à pointer de travers. L'éclairage calculé avec elle sera donc faux.

   avant            après (x doublé)
   N=(1,1)          N appliquée: (2,1)  ✗ plus perpendiculaire
     \              N correcte:  (1,2)  ✓
   ———\———        ————————\—————

Pourquoi : la mise à l'échelle non uniforme

Le coupable est la mise à l'échelle non uniforme (des facteurs différents selon les axes). Une rotation, ou une échelle uniforme, préservent les angles : la perpendicularité survit, donc la normale reste juste. Mais étirer plus dans une direction que dans l'autre déforme les angles — et un vecteur perpendiculaire ne le reste pas si on le déforme comme le reste. La normale a besoin d'un traitement qui « compense » cette déformation.

La solution : l'inverse-transposée

La règle universelle : on transforme une normale par la transposée de l'inverse de la matrice de transformation, notée (M⁻¹)ᵀ.

N' = N × (M⁻¹)ᵀ

Sur l'exemple, l'inverse-transposée de « doubler le x » applique un facteur 1/2 sur le x de la normale, ce qui redonne N' = (1, 2) après normalisation — de nouveau perpendiculaire au segment étiré. La déformation est exactement compensée.

La justification tient en une ligne : on veut préserver l'orthogonalité entre la normale n et n'importe quel vecteur tangent v à la surface (v · n = 0). Si la tangente se transforme en v' = v × M, alors imposer v' · n' = 0 force la normale à se transformer en n' = n × (M⁻¹)ᵀ. C'est la seule matrice qui maintient le produit scalaire nul, donc la perpendicularité.

Le cas chanceux : la rotation pure

Bonne nouvelle : pour une rotation pure (et plus généralement une matrice orthogonale, où la transposée égale l'inverse, Mᵀ = M⁻¹), on a (M⁻¹)ᵀ = M. L'inverse-transposée redonne la matrice d'origine ! Donc tant que tu n'as que des rotations (et des translations, qui n'affectent pas les vecteurs), tu peux transformer les normales avec la même matrice sans rien casser. C'est pour ça que le bug reste longtemps invisible : il n'apparaît qu'au moment où une mise à l'échelle non uniforme entre en jeu — quand une sphère devient un ellipsoïde, par exemple.

La règle de sécurité est donc simple : toujours utiliser l'inverse-transposée pour les normales. Dans le cas des rotations pures, ça ne coûte rien (c'est la même matrice) ; dans le cas des échelles non uniformes, ça sauve l'éclairage. Quand on dispose explicitement des tangentes et bitangentes de la surface (article 06), on peut recalculer la normale par produit vectoriel après transformation ; sinon, l'inverse-transposée reste la solution générale.

L'article suivant explique justement comment on calcule cet inverse d'une matrice, avec la méthode de Gauss-Jordan.


Sources

  • Scratchapixel. Geometry — Transforming Normals. scratchapixel.com
  • Pharr, M., Jakob, W., & Humphreys, G. (2023). Physically Based Rendering (4ᵉ éd.), section « Transforming Normals ». pbr-book.org
  • Turkowski, K. (1990). Properties of Surface-Normal Transformations. Dans Graphics Gems (A. Glassner, dir.), p. 539-547. Academic Press. (La référence classique sur l'inverse-transposée.)

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