Was repräsentiert eine Matrix?

19

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:

Bildbeschreibung hier eingeben

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 Xyund 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.

Trauriger CRUD Entwickler
quelle

Antworten:

19

Matrizen in Computergrafiken sind die Transformationen, die für jede Koordinate im Modell angegeben werden. Jede Matrix ist eine Kombination aus mehreren Transformationen, die auf eine Koordinate angewendet werden sollen (ein Punkt im 3-Raum).

Das Erstellen einer Transformation basiert auf einem von drei Transformationstypen: Übersetzen, Drehen und Skalieren.

Eine Übersetzungsmatrix ist so etwas wie:

Eine Übersetzungsmatrix

Und eine Skalenmatrix: Matrix skalieren

Rotationsmatrizen sehen aus wie:

Bildbeschreibung hier eingeben

Um eine dieser Matrizen zu kombinieren, multiplizieren Sie sie einfach miteinander. Um die Transformation auf einen Scheitelpunkt anzuwenden, multiplizieren Sie einfach den Scheitelpunkt (siehe Übersetzungsdiagramm).

Alex Shepard
quelle
4
O Matrizen repräsentieren also keine Punkte. Ich bin jetzt verlegen
Sad CRUD Developer
Häufig werden sie auf ein Objekt oder das Ansichtsfenster als Ganzes angewendet (so erhalten Sie Ihre Ortho- und Perspektivansichten)
Alex Shepard
3
@BDillan: Nein, aber sie können durchaus Punkte enthalten. Beispielsweise definiert die letzte Spalte in einer ModelView-Matrix (GL / column-major), wie der Ursprung übersetzt wird. Oder anders ausgedrückt, es definiert, wo sich das Auge im Weltraum befindet und kann buchstäblich als eigenständiger Punkt verwendet werden.
Andon M. Coleman
Ihre Koordinate ein 3-Tupel. Warum ist die Matrix nicht 3 mal 3? Angenommen, Sie können die drei Transformationstypen in einer einzigen Matrix kombinieren und haben dennoch genügend Platz. Was bedeutet dann, dass in der rechten unteren Ecke immer 1 angezeigt wird?
n611x007
Die vierte Zeile / Spalte ist speziell für Übersetzungen vorgesehen. Eine der schönsten Eigenschaften der Matrixmathematik ist, dass ich alle Übersetzungen und Rotationen, die ich ausführen möchte, in einer einzigen Matrix kombinieren kann. Dies bedeutet, dass sehr, sehr komplexe Transformationssätze (theoretisch unendlich) auf 1 Matrix komprimiert werden können. Ja, diese letzte Zelle bleibt 1, aber wir können den Rest der Berechnung durchführen.
Alex Shepard
10

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 * matrixoder verwenden matrix * 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 .

wjl
quelle
Ich habe Tonnen von "guten" Büchern über lineare Algebra, von denen ich einige sogar gelesen und verstanden habe. Die Sache ist, dass es kein bisschen hilft, nicht, dass ich sie habe und auch nicht, dass ich es verstanden habe. Ich habe das Gefühl, dass Ihr letzter Rat die falsche Annahme beantwortet.
n611x007
9

Was ist eine Matrix?

Eine Matrix mit mSpalten und nZeilen repräsentiert eine Funktion, die einen Vektor * mit mElementen (oder Koordinaten) verbraucht und einen Vektor mit nElementen 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 Ausgabe v, die Matrix M(die Multiplikation M*u=vist dann die gleiche wie f(u)=v) und u(i)geben das ith-Element von an u(das 2. Element ist zum Beispiel die y-Koordinate). Für die Matrix M(i,j)bedeutet Zeile i, Spalte j.

Die Konstruktion des Elements v(1), das erste im Ergebnis, wird durch die erste Zeile der Matrix beschrieben. u(1)Zeiten M(1,1), plus u(2)Zeiten M(1,2), ... plus u(i)Zeiten M(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 uhorizontal aus. Sie schreiben die i-te Zeile Mdarunter. 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 erhalten v. (Jetzt sehen Sie, warum eine mBy- nMatrix einen mVektor bearbeiten und einen nVektor 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*Bbedeutet dies "eine Funktion, die Bdann zuerst gilt A". 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. Wenn A*uist das gleiche wie f(u)und B*uist das gleiche wie g(u)dann f(g(u))ist das gleiche wie f(B*u)das gleiche wie A*(B*u).

Ebenso können wiederholte Anwendungen derselben Funktion als Potenzen dargestellt werden, da A*A*Adies die Adreimalige 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:

[ 0 1
  1 0 ]

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 Eingabe X, Yusw. geht in Ausgabe x.

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 um thetaGrad 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 fist so, dass f(u)Sie u 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!

Super
quelle
Wie macht man also eine Matrix für die Addition? Sagen wir, eine Zeile ist Xx Yx Zx Tx... und die letzte Zeile ist tatsächlich 0t 0t 0t 1twie von ersetzt Xt Yt Zt Tt. Um (x+2, y)von (x, y)Ihnen gehen könnte , 1x 0y 0z 2tdass Sie geben würde , 1*x + 0*y + 0*z + 2*1da t=1richtig? 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)
n611x007
2

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.

Andon M. Coleman
quelle
1

TL; DR-Version:

Die ersten drei Elemente [x y z]in jeder Zeile repräsentieren einen einzelnen Basisvektor eines transformierten Koordinatensystems. Das letzte Element wist 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:

  • Ein Punkt iauf der xAchse [1 0 0], aber um 45 Grad gedreht. Dies ist einfach [i_x i_y i_z], in der i_xund i_yist die Schenkel eines Dreiecks mit einem 45-Grad Innenwinkel relativ zu der X - Achse: [cos(45) sin(45) 0].
  • Ein Punkt jauf 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].
  • Ein Punkt kauf der zAchse. In diesem Beispiel zist dies nicht betroffen, da wir in der (bildschirmausgerichteten) xy-Ebene drehen

Wir 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?

i_x i_y i_z
j_x j_y j_z
k_x k_y k_z

Oder

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

Wenn Sie einen Vertex mit dieser Matrix multiplizieren, erhalten Sie

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

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 wnormalerweise ist 1. 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, dass wjeder 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.

3Dave
quelle
2
In dem Moment, in dem Sie feststellen, dass Sie gerade eine bereits beantwortete Frage von vor drei Jahren beantwortet haben ...
3Dave
: P Schauen Sie sich immer das
Fragedatum