Que représente une matrice?

19

J'ai commencé récemment à apprendre OpenGL et j'ai du mal à visualiser ce que sont les matrices et leur rôle dans l'infographie. Étant donné le modèle d'une matrice 4x4 comme ceci:

entrez la description de l'image ici

Je suppose que chaque matrice comme celle-ci sont les coordonnées d'un sommet dans l'espace mondial. Et plusieurs d'entre eux réunis et ombrés donnent un objet?

Mais pourquoi y a-t-il un Xx, un Xyet un Xz? J'ai lu que son un axe différent (haut, gauche, avant) mais ne peut toujours pas faire des têtes ou des queues de la signification.

Sad CRUD Developer
la source

Réponses:

19

Les matrices en infographie sont les transformations données à chaque coordonnée du modèle. Chaque matrice est une combinaison de transformations multiples à appliquer à une coordonnée (un point dans 3 espaces).

La construction d'une transformation est basée sur l'un des trois types de transformation: translation, rotation et mise à l'échelle.

Une matrice de traduction est quelque chose comme:

Une matrice de traduction

Et une matrice d'échelle: Matrice d'échelle

Les matrices de rotation ressemblent à:

entrez la description de l'image ici

Pour combiner l'une de ces matrices, il vous suffit de les multiplier ensemble. Pour appliquer la transformation à un sommet, multipliez simplement le sommet (comme le montre le diagramme de traduction).

Alex Shepard
la source
4
O donc les matrices ne représentent pas des points. Je suis embarrassé maintenant
Sad CRUD Developer
Souvent, ils sont appliqués à un objet ou à la fenêtre dans son ensemble (c'est ainsi que vous obtenez vos vues ortho vs perspective)
Alex Shepard
3
@BDillan: Non, mais ils peuvent certainement contenir des points. La dernière colonne d'une matrice ModelView (GL / column-major), par exemple, définit la façon dont l'origine est traduite. Ou, pour le dire autrement, il définit où l'œil est situé dans l'espace-monde et peut littéralement être utilisé comme point par lui-même.
Andon M. Coleman
vos coordonnées un triplet. pourquoi la matrice n'est-elle pas 3 fois 3? Supposons que pour pouvoir combiner les trois types de transformation en une seule matrice et avoir encore suffisamment d'espace, que fait alors le coin inférieur droit, il semble que ce soit toujours 1?
n611x007
La quatrième ligne / colonne est spécifiquement là pour les traductions. L'une des plus belles caractéristiques des mathématiques matricielles est que je peux combiner toutes les traductions et rotations que je veux accomplir en une seule matrice. Cela signifie que des ensembles de transformations très, très complexes (théoriquement infinis) peuvent être compressés en une matrice. Oui, cette dernière cellule reste 1, mais elle nous permet de faire le reste du calcul.
Alex Shepard
10

En infographie, nous utilisons des matrices pour coder les transformations .

Les matrices qui ne contiennent que des transformations de traduction, de rotation ou de mise à l'échelle ont une interprétation couramment exploitée: le 3x3 supérieur gauche de la matrice ne contient que des données de rotation ou d'échelle, la ligne inférieure ou la colonne de droite contient des données de traduction. Ce n'est pas une généralité, mais cela se vérifie assez souvent pour le sous-ensemble de transformations représenté en infographie que les gens utilisent.

De même, il existe une relation entre les valeurs de la matrice et le cadre de coordonnées correspondant que la matrice représente (ce qui n'est pas toujours "l'espace du monde", je dois le noter). Les colonnes (ou lignes) 3x3 en haut à gauche représentent les axes X, Y et Z du cadre de coordonnées.

Que les lignes représentent ou non les axes ou la colonne dépend de si vous utilisez la convention de multiplication par row vector * matrixou matrix * column vector. Lors de la multiplication matricielle, les dimensions internes des deux matrices doivent concorder, et donc si vous représentez des vecteurs comme des matrices de lignes ou des matrices de colonnes affecte ce choix (OpenGL et les mathématiques traditionnelles ont tendance à préférer les vecteurs de colonnes).

Je recommande d'obtenir un bon livre sur l'algèbre linéaire, ou au moins de jeter un œil à la FAQ Matrix et Quaternion et ce post sur les dispositions matricielles dans DirectX et OpenGL .

wjl
la source
ont des tonnes de "bons" livres sur l'algèbre linéaire dont certains que j'ai même lu et compris. c'est que ça n'aide pas du tout, pas que je les ai ni que je les ai compris. J'ai l'impression que votre dernier conseil répond à la mauvaise hypothèse.
n611x007
9

Qu'est-ce qu'une matrice?

Une matrice avec mcolonnes et nlignes représente une fonction qui consomme un vecteur * avec des méléments (ou coordonnées) et produit un vecteur avec des néléments.

De cela, vous pouvez observer que si et seulement si une matrice est carrée, la dimensionnalité du vecteur ne changera pas. Par exemple. vous obtenez un vecteur 3D en transformant un vecteur 3D, un 2D en 2D, etc.

* : En physique, les vecteurs sont généralement utilisés pour indiquer des forces ou d'autres "influences" qui "se déplacent" telles que la vitesse ou l'accélération. Mais rien ne vous empêche d'utiliser un vecteur pour représenter un point ou tout tableau arbitraire de nombres (certaines bibliothèques et langages de programmation utilisent même "vecteur" pour signifier "tableau 1D"). Pour une utilisation avec des matrices, tout peut être les éléments de votre vecteur (même des chaînes ou des couleurs), tant que vous avez un moyen de les additionner, de les soustraire et de les multiplier par quels que soient les éléments de votre matrice. D'où le nom du vecteur , qui signifie «porteur» - il porte ou détient des valeurs pour vous.

Que signifie multiplier par une matrice?

Donc, si une matrice est une fonction, quel genre de fonction ? Que fait la fonction? La recette est définie par les éléments de la matrice. Appelons l'entrée u, la sortie v, la matrice M(la multiplication M*u=vest alors la même que f(u)=v) et u(i)donne le ith élément de u(le 2e élément est la coordonnée y, par exemple). Pour la matrice, M(i,j)signifie ligne i, colonne j.

La construction de l'élément v(1), la première du résultat, est décrite par la première ligne de la matrice. u(1)fois M(1,1), plus u(2)fois M(1,2), ... plus u(i)fois M(1,i). Une matrice est un peu comme un langage de programmation très simple, qui n'est bon que pour programmer des fonctions qui fonctionnent en mélangeant les entrées, en les ajoutant à elles-mêmes, etc. **

Il est utile d'imaginer que vous travaillez sur un élément de sortie à la fois, par conséquent, vous n'utilisez qu'une seule ligne de la matrice à la fois. Vous écrivez uhorizontalement. Vous écrivez la ième ligne en Mdessous. Vous multipliez chaque paire ci-dessus / ci-dessous et écrivez les produits ci-dessous, puis additionnez les produits. Répétez l'opération pour chaque ligne pour obtenir chaque élément v. (Maintenant, vous voyez pourquoi une matrice mby ndoit fonctionner sur un mvecteur et produire un nvecteur.)

Une autre façon de penser à cela - disons que nous faisons une transformation 3D en 3D, donc une matrice 3x3 (ou transformation 3D comme on les appelle souvent parce que vous pouvez prétendre que cette "fonction" "déplace" des points 3D, même si c'est vraiment juste changer les chiffres). Disons que la première ligne est [1 2 0]. Cela signifie que, pour obtenir x du résultat, obtenez 1 du x de l'entrée, 2 du y de l'entrée et 0 du z de l'entrée. C'est donc vraiment une recette.

** : Si une matrice est un langage de programmation, alors ce n'est même pas Turing complet.

Que signifie multiplier deux matrices?

S'ils sont tous les deux des matrices de taille appropriée, cela A*Bsignifie "une fonction qui s'applique en premier Balors A". Vous pouvez voir pourquoi les contraintes sur les tailles de multiplication existent, car la taille détermine la taille d'entrée et de sortie, et une matrice consomme la sortie de l'autre. Pourquoi la multiplication signifie-t-elle combiner des fonctions? Il est plus facile de remarquer que cela doit être le cas. Si A*uest identique à f(u)et B*uest identique à g(u)alors f(g(u))est identique à f(B*u)qui est identique à A*(B*u).

De même, des applications répétées de la même fonction peuvent être représentées comme des pouvoirs, car cela A*A*Asignifie appliquer la fonction qui Areprésente trois fois.

Comment les matrices sont-elles utiles?

À quoi sert une transformation comme new_x = 1*x+2*y+0*z(si la première ligne est [1 2 0])? Ce n'est pas très évident, mais prenons une autre matrice 2D pour expliquer cela. La matrice est:

[ 0 1
  1 0 ]

Ou en [0 1; 1 0]utilisant la notation Matlab pratique. Que fait cette matrice? Il transforme un vecteur 2D comme ceci: Pour le x du résultat, prenez 1 du y de l'entrée. Pour le y de résultat, prenez 1 du x de l'entrée. Nous venons d'échanger les coordonnées x et y de l'entrée - cette matrice reflète les points sur la ligne x = y. C'est en quelque sorte utile! Par extension, vous verrez que toutes les matrices avec 1s le long de la ligne SW - NE se reflètent. Vous pouvez également voir pourquoi les matrices d'identité vous donnent l'entrée (pour x de sortie, prenez x d'entrée; pour y de sortie, prenez y d'entrée ...).

Vous voyez maintenant pourquoi les symboles sont par exemple. Xx, Yx- ils veulent dire combien d'entrée X, Yetc. passe en sortie x.

Sinon, comment les matrices sont-elles utiles?

Quelle autre transformation pouvez-vous faire? Vous pouvez redimensionner en prenant une matrice d'identité, mais avec un nombre différent de 1 le long de la diagonale. Par exemple, [2.5 0; 0 22.5]multipliera chaque coordonnée de l'entrée par 2,5, et si vous appliquez cette matrice à chaque point d'une image, l'image sera 2,5 aussi grande. Si vous ne mettez que 2,5 sur une ligne ( [2.5 0; 0 1]), seule la coordonnée x sera multipliée, vous ne vous étirez donc que le long de x.

D'autres matrices peuvent donner d'autres transformations, telles que le "biais", qui ont différents degrés d'utilité. Personnellement, l'inclinaison est mon moins préférée parce que la matrice a l'air si simple mais la transformation elle-même ne fait rarement rien, à part altérer une image. Une «rotation» est utile: comment faire pivoter un point? Essayez de déterminer la position du point (x, y)après une rotation de thetadegrés dans le sens antihoraire autour de l'origine. Vous constaterez que les nouvelles coordonnées x et y proviennent toutes deux de la multiplication des anciens x et y par des sinus et cosinus de thêta. Vous devriez pouvoir écrire facilement une matrice de rotation en utilisant des sinus et des cosinus qui correspondent à cette fonction.

Avec des matrices non carrées, vous pouvez également modifier la dimensionnalité d'une entrée. Transformer une entrée 2D en 3D n'est pas très utile, car il est difficile de «fabriquer» quelque chose à mettre dans la nouvelle coordonnée, mais la 3D en 2D est très utile. Entre autres choses, c'est ainsi que votre ordinateur sait projeter *** une scène 3D en image 2D pour dessiner sur votre moniteur.

Étant donné que les vecteurs peuvent contenir différentes choses, vous pouvez même décrire une matrice qui crypte une chaîne de n caractères à la fois, en les mélangeant ou en les "multipliant" (vous devrez trouver une fonction de multiplication / addition).

*** : Lorsque vous projetez , vous prenez un objet 3D comme une sculpture, vous y éclairez et voyez quel genre d'ombre 2D tombe sur un mur.

Quelles sont les limites des matrices?

Pouvez-vous faire toutes les fonctions avec des matrices? Non. En pensant graphiquement, il est difficile d'imaginer quelque chose qu'une matrice ne pourrait pas faire (mais elle existe: un effet "tourbillonnant" ne peut pas être fait, par exemple). Cependant, voici un exemple simple: disons que la fonction fest telle qu'elle f(u)vous rend u chaque élément au carré . Vous verrez que vous ne pouvez pas écrire de matrice pour cela: Avec les matrices, il n'y a que la possibilité de décrire des recettes qui multiplient les coordonnées par un nombre constant, aucune autre fonction fantaisie comme la puissance ne peut être exprimée.

**** : C'est aussi pourquoi cela s'appelle l' algèbre linéaire - la fonction de puissance est non linéaire , elle ne fait pas une ligne droite lorsqu'elle est tracée.

Sur la ligne supplémentaire étrange dans les matrices 4D

Maintenant, pourquoi la matrice dans votre exemple 4 par 4? Cela ne signifie-t-il pas un espace à 4 dimensions? Nous n'avons pas d'ordinateurs 4D, alors pourquoi? C'est en fait une astuce intéressante avec des matrices qui se rapporte au point précédent sur les opérations linéaires.

Concernant les fonctions qui ne peuvent pas être faites avec les matrices: Quelle est la matrice pour déplacer un point 2D de 2 unités vers la droite (qui produit le point (x+2, y)? Encore une fois, nous sommes bloqués. Il existe un moyen de multiplier l'entrée, mais aucun moyen d'ajouter Pour le travail 2D, l'astuce consiste à faire comme si vous n'étiez pas dans l'espace 2D, mais dans l'espace 3D, sauf que la hauteur (coordonnée z ou 3e élément) de tout est toujours 1 (c'est un peu comme la façon dont un univers 2D est juste une "plaque" à plat le long du sol d'un univers 3D - dans ce cas, la troisième coordonnée est toujours 0). Ensuite, vous pouvez utiliser cette dernière coordonnée magique comme constante, car vous savez qu'elle est toujours 1 pour chaque entrée.

De même, pour déplacer des points 3D, vous avez besoin de coordonnées 4D. C'est aussi pourquoi toutes les matrices de transformation 3D que vous voyez auront [0 0 0 1]comme dernière ligne - vous ne devez jamais modifier la 4e dimension, sinon le résultat sera trop compliqué à représenter en 3D!

Superbest
la source
alors comment faites-vous une matrice pour l'addition? disons qu'une ligne est Xx Yx Zx Tx... et la dernière ligne est en fait 0t 0t 0t 1tcomme substituée par Xt Yt Zt Tt. Faire (x+2, y)de (x, y)toi pourrait aller 1x 0y 0z 2tça te donnerait 1*x + 0*y + 0*z + 2*1depuis t=1non? Ce qui équivaut à peu près à x + 2. Oh chéri maintenant tu peux aller gâcher ton rendu avec des valeurs T drôles, n'est-ce pas? -grin- (longue lecture, toujours meilleur rapport qualité-prix, thx)
n611x007
2

C'est une matrice de colonne principale 4x4, et à première vue, une matrice de vue.

Les 3 premières colonnes définissent la direction de vos vecteurs de base (haut, gauche, avant comme vous les appeliez), et la dernière colonne définit la translation du point de vue. Rassemblez-les et vous pouvez décrire l'orientation de votre caméra, et plus important encore, vous pouvez utiliser cette matrice pour transformer des points en un espace de coordonnées appelé "espace des yeux", "espace de vue" ou "espace de caméra".

Ce sont tous des synonymes pour le même espace de coordonnées. Malheureusement, vous devez apprendre tous les synonymes lorsque vous travaillez avec des images de synthèse, car différents livres et personnes les appelleront par des noms différents. La plupart des espaces de coordonnées ont plusieurs noms.

Soit dit en passant, les trois colonnes de votre matrice de vue sont généralement orthogonales, c'est-à-dire qu'elles forment des angles droits entre elles. Ce n'est pas obligatoire, mais c'est une propriété très courante lors de la construction d'une caméra traditionnelle.

Andon M. Coleman
la source
1

Version TL; DR:

Les trois premiers éléments [x y z]de chaque ligne représentent un vecteur de base unique d'un système coordonné transformé. Le dernier élément west un composant de traduction.

La version longue

Si vous vouliez une matrice qui, appliquée à un sommet, ferait pivoter le sommet autour de l'origine, disons à 45 degrés, vous rempliriez la matrice de trois vecteurs représentant les axes transformés:

  • Un point isur l' xaxe [1 0 0], mais tourné à 45 degrés. Ceci est tout simplement [i_x i_y i_z], où i_xet i_ysont les branches d'un triangle avec un angle intérieur de 45 degrés par rapport à l'axe X: [cos(45) sin(45) 0].
  • Un point jsur l'axe y [0 1 0], mais pivoté de 45 degrés par rapport à cet axe. Esquissez-le sur une feuille de papier et vous verrez que, en tournant dans le sens antihoraire, les composants deviennent [-sin(45) cos(45) 0].
  • Un point ksur l' zaxe. Dans cet exemple, zn'est pas affecté car nous tournons dans le plan xy (aligné à l'écran)

Nous avons donc trois nouveaux vecteurs: i, j, k. Le moyen le plus simple de visualiser cela consiste simplement à prendre les axes X et Y et à faire pivoter l'ensemble de la disposition croisée.

Comment les mettons-nous dans une matrice?

i_x i_y i_z
j_x j_y j_z
k_x k_y k_z

Ou

 cos(45)  sin(45)    0
-sin(45)  cos(45)    0
    0        0       1

Si vous multipliez un sommet par cette matrice, vous obtiendrez

v1_x = v_x cos(Θ)     - v_y sin(Θ) + v_z * 0
V1_y = v_x*sin(Θ)    + v_y cos(Θ) + v_Z * 0
V1_z = v_x * 0        + v_y * 0    + v_z * 1

pour v = [1 0 0], et Θ = 90°cela devientv1 = [0 1 0]

Pour la traduction, nous ajoutons une quatrième ligne et colonne et plaçons les composants de traduction dans la dernière colonne. Nous ajoutons un quatrième composant au sommet wqui est généralement 1. C'est ainsi que, lorsque nous multiplions le sommet par la matrice, le composant w entraîne l'ajout de la dernière colonne au sommet d'entrée, de sorte que le sommet est déplacé ou traduit. Nous appelons ces «coordonnées homogènes». (Pour nos besoins, "homogène" signifie simplement qu'il y a un 4ème composant wdans chaque vecteur, et nous utilisons une matrice 4x4 au lieu d'un 3x3. Souvent, vous verrez des shaders qui utilisent des matrices 4x3 pour éviter d'envoyer la 4ème ligne la plus inutile au GPU, qui consomme une mémoire et une bande passante précieuses. La quatrième ligne est nécessaire pour la projection en perspective, mais pas grand-chose d'autre.)

J'espère que cela t'aides.

3Dave
la source
2
Ce moment où vous vous rendez compte que vous venez de répondre à une question déjà répondue il y a trois ans ...
3Dave
: P Regardez toujours la date de la question avant de répondre ...
HolyBlackCat