Maths pour le rendu 3D — 08 — Inverser une matrice (Gauss-Jordan)

L'inverse d'une matrice, c'est la transformation qui annule la première. À quoi ça sert en rendu (passer du monde à la caméra, transformer les normales), et comment la calculer par élimination de Gauss-Jordan.

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


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 :

  1. échanger deux lignes ;
  2. multiplier une ligne par un nombre non nul ;
  3. 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.

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