Seit kurzem lerne ich OpenGL und habe Probleme, die Matrizen und ihre Rolle in der Computergrafik zu erkennen. Angesichts der Vorlage einer 4x4-Matrix wie folgt:
Ich würde annehmen, dass jede Matrix wie diese die Koordinaten eines Scheitelpunkts im Weltraum sind. Und mehrere von ihnen zusammen und beschattet geben ein Objekt?
Aber warum gibt es ein Xx
, ein Xy
und ein Xz
? Ich habe gelesen, dass es sich um eine andere Achse handelt (nach oben, links, nach vorne), aber ich kann die Bedeutung immer noch nicht beurteilen.
In der Computergrafik verwenden wir Matrizen, um Transformationen zu codieren .
Matrizen, die nur Translations-, Rotations- oder Skalierungstransformationen enthalten, werden häufig interpretiert: Die linke obere 3 × 3-Ecke der Matrix enthält nur Rotations- oder Skalierungsdaten, die untere Zeile oder rechte Spalte enthält Übersetzungsdaten. Dies ist keine Allgemeingültigkeit, gilt jedoch häufig genug für die Untergruppe von Transformationen, die in Computergrafiken dargestellt werden und von Menschen verwendet werden.
In ähnlicher Weise besteht eine Beziehung zwischen den Werten der Matrix und dem entsprechenden Koordinatenrahmen, den die Matrix darstellt (was nicht immer "Weltraum" ist, wie ich bemerken sollte). Die 3 x 3 Spalten (oder Zeilen) oben links repräsentieren die X-, Y- und Z-Achse des Koordinatenrahmens.
Ob die Zeilen Achsen oder Spalten darstellen, hängt davon ab, ob Sie die Konvention des Multiplizierens als
row vector * matrix
oder verwendenmatrix * column vector
. Wenn Sie eine Matrixmultiplikation durchführen, müssen die inneren Dimensionen der beiden Matrizen übereinstimmen. Ob Sie also Vektoren als Zeilen- oder Spaltenmatrizen darstellen, wirkt sich auf diese Auswahl aus (OpenGL und traditionelle Mathematik bevorzugen in der Regel Spaltenvektoren).Ich empfehle ein gutes Buch über lineare Algebra zu bekommen oder zumindest einen Blick auf die Matrix- und Quaternion-FAQ und diesen Beitrag über Matrixlayouts in DirectX und OpenGL zu werfen .
quelle
Was ist eine Matrix?
Eine Matrix mit
m
Spalten undn
Zeilen repräsentiert eine Funktion, die einen Vektor * mitm
Elementen (oder Koordinaten) verbraucht und einen Vektor mitn
Elementen erzeugt.Daraus können Sie ersehen, dass sich die Dimensionalität des Vektors nur dann ändert, wenn eine Matrix quadratisch ist. Z.B. Sie erhalten einen 3D-Vektor durch Transformation eines 3D-Vektors, einen 2D-Vektor aus einem 2D-Vektor usw.
* : In der Physik werden Vektoren normalerweise verwendet, um Kräfte oder andere "Einflüsse" anzuzeigen, die sich um Dinge wie Geschwindigkeit oder Beschleunigung "bewegen". Aber nichts hindert Sie daran, einen Vektor zu verwenden, um einen Punkt oder ein beliebiges Array von Zahlen darzustellen (einige Bibliotheken und Programmiersprachen verwenden sogar "Vektor", um "1D-Array" zu bedeuten). Für die Verwendung mit Matrizen können alle Elemente Ihres Vektors (auch Zeichenfolgen oder Farben) verwendet werden, sofern Sie die Möglichkeit haben, sie zu addieren, zu subtrahieren und mit den Elementen Ihrer Matrix zu multiplizieren. Daher auch der Name Vektor , der „Träger“ bedeutet - es trägt oder hält für Sie Werte.
Was bedeutet Multiplikation mit einer Matrix?
Also, wenn eine Matrix eine Funktion ist, welche Art von Funktion ? Was macht die Funktion? Das Rezept dafür wird durch die Elemente der Matrix definiert. Nennen wir die Eingabe
u
, die Ausgabev
, die MatrixM
(die MultiplikationM*u=v
ist dann die gleiche wief(u)=v
) undu(i)
geben dasi
th-Element von anu
(das 2. Element ist zum Beispiel die y-Koordinate). Für die MatrixM(i,j)
bedeutet Zeilei
, Spaltej
.Die Konstruktion des Elements
v(1)
, das erste im Ergebnis, wird durch die erste Zeile der Matrix beschrieben.u(1)
ZeitenM(1,1)
, plusu(2)
ZeitenM(1,2)
, ... plusu(i)
ZeitenM(1,i)
. Eine Matrix ist ein bisschen wie eine sehr einfache Programmiersprache, die nur für Programmierfunktionen geeignet ist, bei denen die Eingaben gemischt und zu sich selbst hinzugefügt werden. **Es ist hilfreich, sich vorzustellen, dass Sie jeweils nur an einem Ausgabeelement arbeiten. Daher verwenden Sie jeweils nur eine Zeile der Matrix. Sie schreiben
u
horizontal aus. Sie schreiben die i-te ZeileM
darunter. Sie multiplizieren jedes Paar über / unter und schreiben die Produkte unten, dann addieren Sie die Produkte. Wiederholen Sie diesen Vorgang für jede Zeile, um alle Elemente von zu erhaltenv
. (Jetzt sehen Sie, warum einem
By-n
Matrix einenm
Vektor bearbeiten und einenn
Vektor erzeugen muss .)Eine andere Möglichkeit, dies zu überdenken: Nehmen wir an, wir führen eine 3D-zu-3D-Transformation durch, also eine 3x3-Matrix (oder 3D-Transformation, wie sie oft genannt wird, weil Sie so tun können, als ob diese "Funktion" 3D-Punkte "bewegt", obwohl es sich tatsächlich um 3D-Punkte handelt nur die Zahlen ändern). Nehmen wir an, die erste Reihe ist
[1 2 0]
. Das heißt, um x des Ergebnisses zu erhalten, erhalten Sie 1 von x der Eingabe, 2 von y der Eingabe und 0 von z der Eingabe. Es ist also wirklich ein Rezept.** : Wenn eine Matrix eine Programmiersprache ist, ist sie noch nicht einmal vollständig.
Was bedeutet die Multiplikation zweier Matrizen?
Handelt es sich bei beiden um Matrizen entsprechender Größe, so
A*B
bedeutet dies "eine Funktion, dieB
dann zuerst giltA
". Sie können sehen, warum die Beschränkungen für die Größen für die Multiplikation bestehen, da die Größe die Eingabe- und Ausgabegröße bestimmt und eine Matrix die Ausgabe der anderen verbraucht. Warum bedeutet Multiplikation, Funktionen zu kombinieren? Es ist leichter zu bemerken, dass es sein muss. WennA*u
ist das gleiche wief(u)
undB*u
ist das gleiche wieg(u)
dannf(g(u))
ist das gleiche wief(B*u)
das gleiche wieA*(B*u)
.Ebenso können wiederholte Anwendungen derselben Funktion als Potenzen dargestellt werden, da
A*A*A
dies dieA
dreimalige Anwendung der Funktion bedeutet .Wie sind Matrizen nützlich?
Was nützt es, eine Transformation durchzuführen
new_x = 1*x+2*y+0*z
(wenn die erste Zeile [1 2 0] ist)? Das ist nicht sehr offensichtlich, aber nehmen wir eine andere 2D-Matrix, um das zu erklären. Die Matrix lautet:Oder
[0 1; 1 0]
mit der praktischen Matlab-Notation. Was macht diese Matrix? Es transformiert einen 2D-Vektor wie folgt: Nehmen Sie für das x des Ergebnisses 1 des y der Eingabe. Für das y des Ergebnisses wird 1 des x der Eingabe genommen. Wir haben gerade die x- und y-Koordinaten der Eingabe vertauscht - diese Matrix spiegelt Punkte um die x = y-Linie wider . Das ist irgendwie nützlich! Durch die Erweiterung, werden Sie sehen , dass alle Matrizen mit 1s entlang der SW - NE Linie reflektieren. Sie können auch sehen, warum Identitätsmatrizen Ihnen die Eingabe zurückgeben (für x der Ausgabe nehmen Sie x der Eingabe; für y der Ausgabe nehmen Sie y der Eingabe ...).Jetzt sehen Sie, warum die Symbole z.
Xx
,Yx
- sie bedeuten , wie viel von EingabeX
,Y
usw. geht in Ausgabex
.Wie sonst sind Matrizen nützlich?
Welche andere Transformation kannst du machen? Sie können die Größe ändern, indem Sie eine Identitätsmatrix mit einer anderen Nummer als 1 entlang der Diagonale verwenden. Wenn Sie beispielsweise
[2.5 0; 0 22.5]
jede Koordinate der Eingabe mit 2,5 multiplizieren und diese Matrix auf jeden Punkt in einem Bild anwenden, wird das Bild 2,5 mal so groß. Wenn Sie nur eine 2,5 in eine Zeile ([2.5 0; 0 1]
) einfügen, wird nur die x-Koordinate multipliziert, sodass Sie sich nur entlang x strecken.Andere Matrizen können andere Transformationen ergeben, wie beispielsweise "Schrägstellen", die einen unterschiedlichen Grad an Nützlichkeit aufweisen. Ich persönlich bin am wenigsten geneigt, weil die Matrix so einfach aussieht, aber die Transformation selbst macht selten etwas anderes als ein Bild zu entstellen. Eine nützliche ist "Rotation" - wie rotiert man einen Punkt? Versuchen Sie, die Position des Punktes zu ermitteln,
(x, y)
nachdem Sie ihn umtheta
Grad gegen den Uhrzeigersinn um den Ursprung gedreht haben. Sie werden feststellen, dass die neuen x- und y-Koordinaten beide aus der Multiplikation des alten x und y mit einigen Sinus- und Cosinus-Theta-Werten resultieren. Sie sollten in der Lage sein, eine Rotationsmatrix mit Sinus und Cosinus, die dieser Funktion entspricht, einfach zu schreiben.Mit nicht quadratischen Matrizen können Sie auch die Dimensionalität einer Eingabe ändern. Das Umwandeln einer 2D-Eingabe in 3D ist nicht sehr nützlich, da es schwierig ist, etwas in die neue Koordinate zu "fertigen", aber das Umwandeln von 3D in 2D ist sehr nützlich. Unter anderem weiß Ihr Computer, *** wie Sie eine 3D-Szene in ein 2D-Bild projizieren, um es auf Ihrem Monitor zu zeichnen.
Da Vektoren verschiedene Dinge enthalten können, könnten Sie sogar eine Matrix beschreiben, die jeweils eine Zeichenfolge mit n Zeichen verschlüsselt, indem Sie diese umeinander mischen oder "multiplizieren" (Sie müssten sich eine Multiplikations- / Additionsfunktion einfallen lassen).
*** : Wenn Sie projizieren , nehmen Sie ein 3D-Objekt wie eine Skulptur, beleuchten es und sehen, welche Art von 2D-Schatten auf eine Wand fällt.
Was sind die Grenzen von Matrizen?
Können Sie jede Funktion mit Matrizen ausführen? Nein. Wenn Sie grafisch denken, können Sie sich nur schwer vorstellen, was eine Matrix nicht kann (aber es gibt einen "Wirbel" -Effekt, der zum Beispiel nicht möglich ist). Hier ist jedoch ein einfaches Beispiel: Nehmen wir an, die Funktion
f
ist so, dassf(u)
Sieu
mit jedem quadratischen Element zurückfinden . Sie werden sehen, dass Sie dafür keine Matrix schreiben können: Bei Matrizen gibt es nur die Möglichkeit, Rezepte zu beschreiben, bei denen Koordinaten mit einer konstanten Zahl multipliziert werden. Andere ausgefallene Funktionen wie die Potenz können nicht ausgedrückt werden.**** : Dies ist auch der Grund, warum es als lineare Algebra bezeichnet wird - die Potenzfunktion ist nicht linear und zeichnet keine gerade Linie.
Auf der seltsamen zusätzlichen Reihe in 4D-Matrizen
Warum ist die Matrix in Ihrem Beispiel 4 mal 4? Bedeutet das nicht 4-dimensionaler Raum? Wir haben keine 4D Computer, warum also? Dies ist tatsächlich ein interessanter Trick mit Matrizen, der sich auf den vorherigen Punkt über lineare Operationen bezieht.
Zu den Funktionen, die mit Matrizen nicht möglich sind: Wie lautet die Matrix zum Verschieben eines 2D-Punkts um 2 Einheiten nach rechts (wodurch der Punkt erzeugt wird)
(x+2, y)
? Auch hier bleiben wir stecken. Es gibt eine Möglichkeit, die Eingabe zu multiplizieren, aber keine Möglichkeit zum Hinzufügen Bei 2D-Arbeiten besteht der Trick darin, so zu tun, als ob Sie sich nicht im 2D-Raum befinden, sondern im 3D-Raum, außer dass die Höhe (z-Koordinate oder 3. Element) von allem immer 1 ist (ein bisschen wie bei einem 2D-Universum) Nur eine "Platte", die flach auf dem Boden eines 3D-Universums liegt - in diesem Fall ist die dritte Koordinate immer 0.) Dann können Sie diese magische letzte Koordinate als Konstante verwenden, da Sie wissen, dass sie für jede Eingabe immer 1 ist.Ebenso benötigen Sie zum Verschieben von 3D-Punkten 4D-Koordinaten. Das ist auch der Grund, warum alle 3D-Transformationsmatrizen, die Sie sehen,
[0 0 0 1]
als letzte Zeile angezeigt werden - Sie dürfen niemals die 4. Dimension ändern, da das Ergebnis sonst zu kompliziert ist, um es in 3D darzustellen!quelle
Xx Yx Zx Tx
... und die letzte Zeile ist tatsächlich0t 0t 0t 1t
wie von ersetztXt Yt Zt Tt
. Um(x+2, y)
von(x, y)
Ihnen gehen könnte ,1x 0y 0z 2t
dass Sie geben würde ,1*x + 0*y + 0*z + 2*1
dat=1
richtig? Das entspricht ziemlich genau x + 2. Oh je, jetzt kannst du dein Rendering mit lustigen T-Werten durcheinander bringen, oder? -grin- (lange gelesen, immer noch der beste Wert, danke)Das ist eine 4 × 4-Matrix mit Spalten und, wie es aussieht, eine Ansichtsmatrix.
Die ersten drei Spalten definieren die Richtung Ihrer Basisvektoren (nach oben, links, nach vorne, wie Sie sie genannt haben), und die letzte Spalte definiert die Verschiebung des Augenpunkts. Wenn Sie sie zusammenfügen, können Sie die Ausrichtung Ihrer Kamera beschreiben und, was noch wichtiger ist, mithilfe dieser Matrix Punkte in einen Koordinatenraum umwandeln, der als "Augenraum", "Sichtraum" oder "Kameraraum" bezeichnet wird.
Das sind alles Synonyme für den gleichen Koordinatenraum. Leider müssen Sie beim Umgang mit Computergrafiken alle Synonyme lernen, da verschiedene Bücher und Personen sie mit unterschiedlichen Namen bezeichnen. Die meisten Koordinatenräume haben mehrere Namen.
Übrigens sind die drei Spalten in Ihrer Ansichtsmatrix im Allgemeinen orthogonal, dh sie bilden rechtwinklig zueinander. Dies ist nicht erforderlich, ist jedoch eine sehr häufige Eigenschaft beim Aufbau einer herkömmlichen Kamera.
quelle
TL; DR-Version:
Die ersten drei Elemente
[x y z]
in jeder Zeile repräsentieren einen einzelnen Basisvektor eines transformierten Koordinatensystems. Das letzte Elementw
ist eine Übersetzungskomponente.Die lange Version
Wenn Sie eine Matrix wünschen, die bei Anwendung auf einen Scheitelpunkt den Scheitelpunkt um beispielsweise 45 Grad um den Ursprung dreht, füllen Sie die Matrix mit drei Vektoren, die die transformierten Achsen darstellen:
i
auf derx
Achse[1 0 0]
, aber um 45 Grad gedreht. Dies ist einfach[i_x i_y i_z]
, in deri_x
undi_y
ist die Schenkel eines Dreiecks mit einem 45-Grad Innenwinkel relativ zu der X - Achse:[cos(45) sin(45) 0]
.j
auf der y-Achse[0 1 0]
, der jedoch um 45 Grad von dieser Achse gedreht wurde. Skizzieren Sie es auf ein Stück Papier und Sie werden sehen, dass die Komponenten gegen den Uhrzeigersinn gedreht werden[-sin(45) cos(45) 0]
.k
auf derz
Achse. In diesem Beispielz
ist dies nicht betroffen, da wir in der (bildschirmausgerichteten) xy-Ebene drehenWir haben also drei neue Vektoren: i, j, k. Die einfache Art, dies zu visualisieren, besteht darin, nur die X- und Y-Achse zu nehmen und die gesamte Kreuzanordnung zu drehen.
Wie setzen wir diese in eine Matrix ein?
Oder
Wenn Sie einen Vertex mit dieser Matrix multiplizieren, erhalten Sie
denn
v = [1 0 0]
undΘ = 90°
das wirdv1 = [0 1 0]
Für die Übersetzung fügen wir eine vierte Zeile und Spalte hinzu und setzen die Übersetzungskomponenten in die letzte Spalte. Wir fügen dem Vertex eine vierte Komponente hinzu, die
w
normalerweise ist1
. Dies ist so, dass beim Multiplizieren des Scheitelpunkts mit der Matrix die w-Komponente bewirkt, dass die letzte Spalte zum Eingabe-Scheitelpunkt hinzugefügt wird, sodass der Scheitelpunkt verschoben oder verschoben wird. Wir nennen diese "homogenen Koordinaten". (Für unsere Zwecke bedeutet "homogen" nur, dassw
jeder Vektor eine vierte Komponente enthält, und wir verwenden eine 4x4-Matrix anstelle einer 3x3-Matrix. Häufig sehen Sie Shader, die 4x3-Matrizen verwenden, um das Senden der meist unbrauchbaren vierten Zeile zu vermeiden auf die GPU, die wertvollen Speicher und Bandbreite verbraucht. Die 4. Reihe wird für die perspektivische Projektion benötigt, aber sonst nicht viel.)Hoffe das hilft.
quelle