08 — Inverser une matrice (Gauss-Jordan)
Ce que tu vas apprendre
- Ce qu'est l'inverse d'une matrice, et l'intuition « annuler une transformation »
- À quoi l'inverse sert concrètement en rendu
- La méthode de Gauss-Jordan, étape par étape
- Les raccourcis quand la matrice est spéciale (orthogonale)
Prérequis
- Les matrices et leur composition
Une matrice transforme : elle tourne, étire, déplace. Son inverse fait exactement l'inverse — il annule la transformation et ramène à l'état de départ. Si M tourne de 30°, M⁻¹ tourne de −30°. Si M double la taille, M⁻¹ la divise par deux. Formellement :
M × M⁻¹ = I (la matrice identité, le « ne rien faire »)
C'est l'équivalent matriciel de l'inverse d'un nombre (5 × 1/5 = 1).
À quoi ça sert en rendu
L'inverse est partout dans le pipeline, parce que le rendu passe son temps à faire des allers-retours entre repères.
- Monde → caméra. On construit facilement la matrice caméra-vers-monde (où est la caméra, où elle regarde — c'est la fonction LookAt de l'article 10). Mais pour rendre, les API ont besoin de l'inverse : la matrice monde-vers-caméra, qui exprime la scène du point de vue de la caméra.
- Transformer les normales. On l'a vu à l'article 07 : les normales se transforment par l'inverse-transposée de la matrice de l'objet.
- Lancer de rayons dans l'espace local. Plutôt que de transformer un objet complexe, on transforme le rayon dans le repère local de l'objet en lui appliquant l'inverse de sa matrice — bien moins coûteux.
Savoir inverser une matrice n'est donc pas un luxe théorique : c'est une brique opérationnelle.
La méthode de Gauss-Jordan
Comment calcule-t-on M⁻¹ ? La méthode la plus claire est l'élimination de Gauss-Jordan. L'idée : on pose côte à côte la matrice M et l'identité I, et on applique à toutes les deux les mêmes opérations sur les lignes, jusqu'à transformer M en I. À ce moment-là, l'identité de départ s'est transformée… en M⁻¹.
[ M | I ] --(opérations sur les lignes)--> [ I | M⁻¹ ]
Les opérations autorisées sur les lignes sont au nombre de trois :
- échanger deux lignes ;
- multiplier une ligne par un nombre non nul ;
- ajouter à une ligne un multiple d'une autre.
La procédure, colonne par colonne :
- on choisit un pivot (l'élément diagonal de la colonne courante) ;
- on divise toute sa ligne pour amener le pivot à 1 ;
- on retranche des autres lignes ce qu'il faut pour mettre des 0 partout ailleurs dans la colonne.
En répétant pour chaque colonne, le bloc de gauche devient l'identité, et le bloc de droite devient l'inverse. Pour une matrice 4×4 — le format du rendu — c'est mécanique mais un peu long ; en pratique, on l'écrit une fois proprement dans la classe Matrix44 et on n'y revient plus.
cpp// principe (schéma) : [M | I] -> [I | M^-1]
// pour chaque colonne c :
// - trouver un pivot non nul (échanger des lignes si besoin)
// - normaliser la ligne du pivot
// - éliminer la colonne c dans toutes les autres lignes
Quand l'inverse n'existe pas
Toutes les matrices ne sont pas inversibles. Si une transformation écrase l'espace — par exemple une mise à l'échelle par 0 sur un axe, qui aplatit la 3D en 2D — l'information est perdue et rien ne peut la restaurer. Mathématiquement, ces matrices ont un déterminant nul. En Gauss-Jordan, ça se manifeste par un pivot impossible à trouver (une colonne entière de zéros). Heureusement, les transformations usuelles du rendu (rotations, translations, échelles non nulles) sont toujours inversibles.
Le raccourci des matrices orthogonales
Bonne nouvelle qui revient : pour une matrice orthogonale — c'est-à-dire faite uniquement de rotations (axes unitaires et perpendiculaires) — l'inverse est gratuit, car il est simplement égal à la transposée :
M orthogonale ⟹ M⁻¹ = Mᵀ
Transposer, c'est juste échanger les lignes et les colonnes : aucune élimination, aucun calcul lourd. C'est exactement ce qu'on exploitera pour passer de la matrice caméra-vers-monde à monde-vers-caméra, puisque la partie rotation d'une caméra est orthogonale. Connaître ce raccourci évite des calculs inutiles dans le code chaud du rendu.
L'article suivant change de registre : l'interpolation, l'art de fabriquer des valeurs intermédiaires — entre deux couleurs, deux positions, deux instants.
Sources
- Scratchapixel. Matrix Inverse: Gauss-Jordan Method. scratchapixel.com
- Élimination de Gauss-Jordan. Wikipedia
- Strang, G. (2016). Introduction to Linear Algebra (5ᵉ éd.), chap. 2-3 (élimination, inverses). Wellesley-Cambridge Press.