Les Matrices

Les mathématiques invisibles derrière un monde 3D


Chapitre I - Derrière chaque image, des mathématiques


Lorsque nous observons une scène 3D, nous avons naturellement tendance à voir des objets : un cube, un bâtiment, un arbre, un personnage ou un terrain.

Pour l’ordinateur, la réalité est très différente.

Un objet 3D est essentiellement constitué de sommets, appelés vertices, possédant des coordonnées dans l’espace. Ces sommets sont ensuite reliés pour former des triangles, qui constituent progressivement la surface de l’objet.

Un sommet peut par exemple se trouver à la position :

 

X = 2, Y = 1, Z = 4

 

Mais cette position n’est pas nécessairement sa position définitive dans le monde :

  • L’objet peut être déplacé.
  • Il peut être tourné.
  • Il peut être grandi.
  • Il peut appartenir à un autre objet lui-même en mouvement.
  • La caméra peut également changer de position.

Et finalement, cette scène en trois dimensions doit être transformée pour apparaître sur un écran qui, lui, n’est constitué que de deux dimensions.

Le moteur doit donc effectuer une succession de transformations.

C’est précisément là que les matrices deviennent indispensables.

Elles permettent de représenter ces transformations sous une forme mathématique extrêmement efficace et, surtout, de les combiner.


Chapitre II - Qu'est-ce qu'une matrice ?


Une matrice est avant tout un tableau organisé de nombres.

Une matrice 3 x 3 possède trois lignes et trois colonnes :

 

1 0 0 0 1 0 0 0 1

Une matrice 4 x 4 en possède quatre :

 

1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1

 

Cette seconde forme est particulièrement importante en infographie 3D.

Mais une matrice ne doit pas simplement être considérée comme un tableau contenant seize nombres.

Dans le contexte d’un moteur 3D, on peut la voir comme une transformation prête à être appliquée.

Elle peut notamment représenter :

  • un déplacement;
  • une rotation;
  • un changement d’échelle;
  • un changement de référentiel;
  • une transformation liée à la caméra;
  • une projection.

Une matrice reçoit donc des coordonnées et produit de nouvelles coordonnées.

C’est cette idée qu’il faut retenir avant toutes les autres : 

Une matrice peut transformer l’espace


Chapitre III - Des vecteurs aux matrices


Avant de transformer quelque chose, encore faut-il pouvoir décrire sa position.

C’est notamment le rôle des vecteurs.

En 3D, un vecteur peut être représenté par trois composantes :

 

V = (X, Y, Z) par exemple : V = (2, 3, 5)

 

Selon le contexte, un tel vecteur peut représenter une position, une direction ou encore une information géométrique.

Imaginons maintenant que nous voulions faire tourner tous les sommets d’un cube.

Nous pourrions recalculer séparément la position de chaque sommet.

Mais une approche beaucoup plus puissante consiste à définir une transformation, puis à l’appliquer à chacun des sommets.

Cette transformation peut être continue dans une matrice.

Le principe devient alors :

 

Coordonnées initiales ↓ Matrice ↓ Nouvelles coordonnées

 

Le vecteur décrit donc ce que nous souhaitons transformer.

La matrice décrit comment nous souhaitons le transformer.

Cette association entre vecteurs et matrices constitue l’une des bases de l’infographie 3D.


Chapitre IV - Pourquoi des matrices 4 x 4 dans un monde 3D ?


Une question apparaît rapidement.

Si notre univers possède trois dimensions X, Y et Z, pourquoi les moteurs graphiques utilisent-ils aussi souvent des matrices 4 x 4 ?

Parce qu’une quatrième composante extrêmement utile est ajoutée : 

  • W.

Un sommet peut alors être représenté sous la forme : 

 

X Y Z W

 

Pour une position classique, on utilise généralement :

 

W = 1

 

Cette représentation porte le nom de coordonnées homogènes.

Elle permet notamment d’intégrer la translation dans le même système mathématique que la rotation et l’échelle.

Nous pouvons alors représenter plusieurs types de transformations avec une structure commune : la matrice 4 x 4.

Cette quatrième dimension mathématique ne signifie donc pas que notre jeu possède soudainement un espace physique à quatre dimensions.

Elle constitue surtout un outil extrêmement pratique permettant d’unifier les calculs.


Chapitre V - La translation : déplacer un objet


Prenons maintenant l’une des opérations les plus simples : déplacer un objet. Faire une Translation.

Supposons qu’un sommet soit situé à :

(1, 2, 3) Nous souhaitons déplacer l'objet de : (+5, 0, +2) Sa nouvelle position devient : (6, 2, 5) Une matrice de translation peut contenir cette information : 1 0 0 Tx 0 1 0 Ty 0 0 1 Tz 0 0 0 1

 

Tx, Ty et Tz représentent le déplacement sur chacun des axes.

En appliquant cette matrice aux sommets de l’objet, l’ensemble de sa géométrie est déplacé.

Lorsque nous modifions simplement la propriété Position d’un Transform dans Unity, nous manipulons donc une notion qui peut ensuite intervenir dans ce type de transformation mathématique.

L’interface masque les calculs.

Les matrices travaillent derrière elle.


Chapitre VI - La rotation : faire tourner l'espace


La Rotation est plus intéressante encore.

Lorsqu’un objet tourne, ses sommets ne sont simplement déplacés d’une quantité fixe. Leur nouvelle position dépend de leur distance et de leur orientation par rapport à l’axe de rotation.

Les matrices permettent de représenter ces rotations autour des axes : 

X; Y; Z;

 

Par exemple, une rotation autour de l’axe Z peut être représentée par une matrice faisant intervenir le sinus et le cosinus de l’angle :

cos 0 -sin 0 0 0 sin 0 cos 0 0 0 0 0 1 0 0 0 0 1

 

Il n’est pas nécessaire de retenir cette formule pour utiliser Unity.

Ce qui compte est d’en comprendre le résultat : les coordonnées des sommets sont recalculées de manière à faire pivoter toute la géométrie.

Un cube n’est donc pas réellement « tourné » comme nous tournerions physiquement un objet avec notre main.

Mathématiquement, ce sont les positions de ses sommets qui sont transformées.


Chapitre VII - L'échelle : agrandir et réduire



L’échelle, ou Scale, permet de modifier les dimensions d’un objet.

Une matrice d’échelle peut prendre cette forme :

 

Sx 0 0 0 0 Sy 0 0 0 0 Sz 0 0 0 0 1

 

Si :

 

Sx = 2 Sy = 2 Sz = 2

 

L’objet est doublé uniformément.

Mais nous pourrions également avoir :

 

Sx = 2 Sy = 1 Sz = 0.5

 

L’objet serait alors étiré sur X, conservé sur Y et comprimé sur Z.

Une nouvelle fois, ce que nous percevons visuellement comme une modification de taille correspond à une transformation des coordonnées de la géométrie.


Chapitre VIII - TRS : Translation, Rotation, Scale


Nous possédons maintenant trois transformations fondamentales :

  1. T – Translation
  2. R – Rotation
  3. S – Scale

En développement 3D, on rencontre très souvent l’abréviation : 

  • TRS

L’intérêt majeur des matrices apparaît ici : plusieurs transformations peuvent être combinées pour construire une seule transformation globale.

Au lieu de considérer séparément :

 

Échelle ↓ Rotation ↓ Translation

 

Le moteur peut construire une matrice représentant l’ensemble.

Dans Unity, cette notion apparaît directement avec :

 

Matrix4x4.TRS()

 

Conceptuellement, cette matrice peut décrire l’état spatial complet d’un objet : sa position, son orientation et son échelle.

Nous commençons alors à retrouver quelque chose de très familier dans Unity : 

  • Transform

Position, Rotation et Scale ne sont donc pas trois propriétés arbitrairement choisies par le moteur.

Elles correspondent aux transformations fondamentales permettant de placer une géométrie dans un espace 3D.


Chapitre IX - La multiplication des matrices


L’une des propriétés les plus puissantes des matrices est leur capacités à être combinées.

Une transformation peut être multipliée par une autre afin d’obtenir une nouvelle transformation.

Supposons que nous disposions d’une matrice d’échelle S, d’une rotation R et d’une translation T.

Nous pouvons construire une transformation combinée.

Mais une règle est fondamentale :

  • L’orde des multiplications est important

Avec les matrices :

 

A x B ≠ B x A

 

Dans le cas général.

Cela signifie qu’effectuer une rotation puis une translation ne produit pas nécessairement le même résultat qu’effectuer une translation puis une rotation.

Cette propriété explique de nombreux comportements qui peuvent sembler étranges lorsqu’on découvre les transformations 3D.

La multiplication matricielle permet également à un moteur de regrouper une longue succession d e transformations en une seule matrice.

C’est particulièrement utile pour les hiérarchies.

Un objet enfant peut être transformé par son propre Transform, puis par celui de son parent, puis éventuellement par celui d’un parent supérieur.

Les matrices permettent de transmettre ces transformations à travers toute cette chaîne.


Chapitre X - Local Space, World Space et View Space


Un point essentiel du développement 3D est qu’une position n’a de sens que par rapport à un référentiel.

Prenons un sommet situé à :

 

(0, 1, 0)

 

Que signifie cette valeur ?

Tout dépend de l’espace dans lequel nous nous trouvons.

  • Object Space ou Locale Space

Les coordonnées sont définies relativement à l’objet lui-même.

Un sommet peut donc se trouver à un mètre au-dessus de l’origine de son objet;

  • World Space

La géométrie est maintenant considérée relativement à l’origine générale du monde.

La matrice de l’objet permet notamment de passer de ses coordonnées locales à ses coordonnées mondiales.

  • View Space

Nous changeons encore de référentiel.

Cette fois, les coordonnées sont exprimées relativement à la caméra.

un même sommet peut donc posséder successivement différentes coordonnées sans avoir changé de point géométrique.

Ce n’est pas nécessairement le sommet qui change.

C’est le référentiel dans lequel nous le décrivons qui change. 


Chapitre XI - La caméra et la View Matrix


Une caméra virtuelle ne fonctionne pas exactement comme un appareil photographique physique.

Pour produire l’image, le moteur doit déterminer où se trouve chaque élément relativement à la caméra.

Une manière très utile de comprendre cette opération consiste à imaginer que, plutôt que de déplacer la caméra dans le monde, nous transformons le monde entier dans le référentiel de la caméra.

C’est le rôle de la View Matrix.

Si la caméra avance, nous pouvons mathématiquement considérer que le monde se déplace dans la direction opposée relativement à elle.

Si elle tourne à droite, les coordonnées du monde sont transformées en conséquence.

La View Matrix convertit les coordonnées du World Space vers le View Space.

À ce stade, notre scène est toujours en trois dimensions.

Il reste une opération fondamentale : la projeter.


Chapitre XII - La Projection Matrix


Notre monde possède une profondeur.

Notre écran, lui, possède essentiellement une largeur et une hauteur.

Il faut donc résoudre un problème majeur :

  • Comment représenter un espace 3D sur une surface 2D ?

C’est notamment le rôle de la Projection Matrix.

Dans une projection en perspective, les objets éloignés semblent plus petits tandis que les objets proches semblent plus grands.

La caméra possède également un volume e vision souvent représentée par un frustum : une forme pyramidale tronquée définissant la partie du monde susceptible d’être visible.

la matrice de projection intervient dans cette transformation.

Elle prend notamment en compte des paramètres liés à la caméra tels que : 

  • le champ de vision;
  • le ratio largeur/hauteur
  • les plans Near et Far; 
  • le type de projection.

Après cette étape, nous nous rapprochons considérablement de la représentation finale destinée à l’écran.


Chapitre XIII - Model, View, Projection : le voyage d'un sommet


Nous pouvons maintenant réunir les différentes étapes.

Prenons simplement un sommet appartenant à un cube.

Au départ, celui-ci possède une position dans le référentiel du cube : 

  • Local Space

Une première transformation place le cube dans le monde :

  • Model Matrix

Nous obtenons alors une position en : 

  • World Space

Ensuite, la caméra entre en jeu :

  • View Matrix

Le sommet est maintenant exprimé relativement à celle-ci :

  • View Space

Puis intervient : 

  • Projection Matrix

Nous obtenons progressivement une position adaptée au pipeline graphique.

Cette succession est souvent résumée par :

 

MVP = Projection x View x Model

 

ou :

 

MVP = Pclip = P x V x M x Plocal

 

Le sommet poursuit encore son parcours à travers plusieurs opérations du pipeline graphique, notamment la division de perspective et la transformation vers les coordonnées de l’écran.

Ainsi, derrière un simple point visible dans  une image se cache une véritable chaîne de transformations.

Et cette opération doit être localisée pour les innombrables sommets nécessaires à la construction d’une scène.


Chapitre XIV - Les matrices dans Unity


Unity masque volontairement une grande partie de cette complexité.

Lorsque nous écrivons : 

 

transform.position

 

ou que nous modifions Position, Rotation et Scale depuis l’Inspector, nous n’avons généralement pas besoin de construire manuellement les matrices nécessaires aux rendu.

Mais Unity permet également d’y accéder.

Par exemple : 

 

Matrix4x4 matrix = transform.localToWorldMatrix;

 

Cette matrice permet de passer de l’espace local d’un objet vers le World Space.

L’opération inverse existe également : 

 

Matrix4x4 matrix = transform.worldToLocalMatrix;

 

Unity possède aussi :

 

Matrix4x4.TRS(position, rotation, scale);

 

Permettant de construire une matrice à partir d’une translation, d’une rotation et d’une échelle.

Un développeur peut également transformer un point :

 

Vector3 wolrdPoint = transform.localToWorldMatrix.MultiplyPoint3x4(localPoint);

 

Ces possibilités deviennent particulièrement intéressantes lorsque l’on travaille sur des systèmes graphiques, des outils personnalisés, des effets procéduraux ou certaines optimisations.


Chapitre XV - Les matrices dans les Shaders



Les matrices occupent également une place fondamentale dans les Shaders.

Un Vertex Shader travaille notamment avec les sommets de la géométrie.

Or ces sommets doivent eux aussi traverser les différents espaces que nous venons d’étudier.

Ils peuvent passer de :

 

Object Space ↓ World Space ↓ View Space ↓ Clip Space

 

Des matrices permettent d’effectuer ces transformations.

Dans l’écosystème Unity, certaines fonctions et variables fournies par le pipeline de rendu permettent d’effectuer ces opérations sans reconstruire systématiquement tous les calculs à la main.

C’est également pour cette raison que les notions de World Space, Object Space, View Space ou Tangent Space apparaissent régulièrement lorsque l’on travaille avec Shader Graph ou HLSL.

Comprendre les matrices permet alors de mieux comprendre ce que le Shader est réellement en train de manipuler.

Le lien entre géométrie, matrices et Shaders devient beaucoup plus clair.


Chapitre XVI - Faut-il connaître toutes ces mathématiques pour créer un jeu ?


Heureusement, non.

Il n’est absolument pas nécessaire de savoir calculer manuellement chaque matrice pour commencer à créer un jeu avec Unity.

Le moteur se charge d’une immense quantité de travail.

Lorsque nous déplaçons un objet dans l’Inspector, Unity gère les transformations nécessaires.

Lorsque nous plaçons une caméra, le moteur construit les informations nécessaires à la vue.

Lorsque nous utilisons un Shader standard, une grand partie du pipeline est déjà prise en charge.

Alors pourquoi apprendre les matrices ?

Parce qu’il existe une différence importante entre utiliser un moteur et comprendre ce qu’il fait.

Lorsque les projets deviennent plus ambitieux, cette compréhension devient progressivement précieuse.

Elle permet de mieux appréhender : 

  • les Shaders;
  • les transformations personnalisées;
  • les systèmes procéduraux;
  • les caméras;
  • certaines animations;
  • les espaces de coordonnées;
  • les problèmes de hiérarchie;
  • les calculs graphiques avancés.

Il n’est donc pas nécessaire de devenir mathématicien.

L’objectif est surtout de développer une intuition.

Lorsque l’on rencontre une matrice dans Unity ou dans un Shader, elle cesse alors d’être un mystérieux tableau de seize nombres.

On commence à comprendre ce qu’elle est probablement en train de transformer.


Chapitre XVII - Conclusion : l'architecture invisible du monde 3D


Lorsque nous regardons un jeu vidéo, nous voyons un monde.

L’ordinateur, lui, voit des : 

  • données;
  • sommets;
  • coordonnées;
  • vecteurs;
  • transformations.

Et parmi les outils permettant de transformer ces données en espace cohérent se trouvent les matrices.

Elles déplacent les coordonnées, participent aux rotations, aux changements d’échelle et aux changements de référentiel. Elles permettent de passer de l’espace local d’un objet au monde, puis du monde à la caméra avant de participer à la projection qui conduira finalement vers l’image affichée.

Elles sont présentes derrière le Transform que nous manipulons quotidiennement dans Unity.

Elles sont présentes dans le fonctionnement des caméras.

Elles sont présentes dans le pipeline graphique.

Elles sont présentes dans les Shaders.

Et pourtant, la plupart du temps, nous ne les voyons jamais.

C’est précisément toute la force d’un moteur moderne : transformer une architecture mathématique extrêmement complexe en outils que le développeur peut manipuler visuellement.

Mais derrière un simple cube que l’on déplace dans une scène se cache déjà une mécanique remarquable.

Les matrices ne construisent pas seulement des tableaux de nombres. Elles permettent aux coordonnées de devenir un espace, à l’espace de devenir une scène et à la scène de devenir une image.