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:
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 Xy
et 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.
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 * matrix
oumatrix * 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 .
la source
Qu'est-ce qu'une matrice?
Une matrice avec
m
colonnes etn
lignes représente une fonction qui consomme un vecteur * avec desm
éléments (ou coordonnées) et produit un vecteur avec desn
é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 sortiev
, la matriceM
(la multiplicationM*u=v
est alors la même quef(u)=v
) etu(i)
donne lei
th élément deu
(le 2e élément est la coordonnée y, par exemple). Pour la matrice,M(i,j)
signifie lignei
, colonnej
.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)
foisM(1,1)
, plusu(2)
foisM(1,2)
, ... plusu(i)
foisM(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
u
horizontalement. Vous écrivez la ième ligne enM
dessous. 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émentv
. (Maintenant, vous voyez pourquoi une matricem
byn
doit fonctionner sur unm
vecteur et produire unn
vecteur.)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*B
signifie "une fonction qui s'applique en premierB
alorsA
". 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. SiA*u
est identique àf(u)
etB*u
est identique àg(u)
alorsf(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*A
signifie appliquer la fonction quiA
repré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: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éeX
,Y
etc. passe en sortiex
.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 detheta
degré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
f
est telle qu'ellef(u)
vous rendu
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!la source
Xx Yx Zx Tx
... et la dernière ligne est en fait0t 0t 0t 1t
comme substituée parXt Yt Zt Tt
. Faire(x+2, y)
de(x, y)
toi pourrait aller1x 0y 0z 2t
ça te donnerait1*x + 0*y + 0*z + 2*1
depuist=1
non? 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)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.
la source
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émentw
est 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:
i
sur l'x
axe[1 0 0]
, mais tourné à 45 degrés. Ceci est tout simplement[i_x i_y i_z]
, oùi_x
eti_y
sont les branches d'un triangle avec un angle intérieur de 45 degrés par rapport à l'axe X:[cos(45) sin(45) 0]
.j
sur 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]
.k
sur l'z
axe. Dans cet exemple,z
n'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?
Ou
Si vous multipliez un sommet par cette matrice, vous obtiendrez
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
w
qui est généralement1
. 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 composantw
dans 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.
la source