Get to know MDN better
Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.
Matrizen können verwendet werden, um Transformationen von Objekten im Raum darzustellen und werden für viele wichtige Berechnungen beim Erstellen von Bildern und Visualisieren von Daten im Web genutzt. Dieser Artikel untersucht, wie Matrizen erstellt werden und wie sie mit CSS-Transformationen und dem matrix3d-Transformationstyp verwendet werden.
Auch wenn dieser Artikel CSS verwendet, um Erklärungen zu vereinfachen, sind Matrizen ein zentrales Konzept, das von vielen verschiedenen Technologien genutzt wird, einschließlich WebGL, der WebXR (VR und AR) API und GLSL-Shader.
Es gibt viele Arten von Matrizen, aber die, die uns interessieren, sind die 3D-Transformationsmatrizen. Diese Matrizen bestehen aus einer Gruppe von 16 Werten, angeordnet in einem 4×4-Raster. In JavaScript ist es einfach, eine Matrix als Array darzustellen.
Beginnen wir mit der Betrachtung der Identitätsmatrix. Dies ist eine spezielle Transformationsmatrix, die ähnlich wie die Zahl 1 bei der Skalarmultiplikation funktioniert; genauso wie n * 1 = n, liefert das Multiplizieren jeder Matrix mit der Identitätsmatrix eine Ergebnis-Matrix, deren Werte mit der ursprünglichen Matrix übereinstimmen.
Die Identitätsmatrix sieht in JavaScript so aus:
Wie sieht das Multiplizieren mit der Identitätsmatrix aus? Das einfachste Beispiel ist, einen einzelnen Punkt mit der Identitätsmatrix zu multiplizieren. Da ein 3D-Punkt nur drei Werte benötigt (x, y und z), und die Transformationsmatrix ein 4×4-Wert-Matrix ist, müssen wir dem Punkt eine vierte Dimension hinzufügen. Diese Dimension wird konventionell als Perspektive bezeichnet und durch den Buchstaben w dargestellt. Bei einer typischen Position wird das Setzen von w auf 1 die Mathematik zum Funktionieren bringen.
Nachdem die w-Komponente zum Punkt hinzugefügt wurde, sehen Sie, wie ordentlich die Matrix und der Punkt ausgerichtet sind:
Die w-Komponente hat einige zusätzliche Anwendungen, die außerhalb des Rahmens dieses Artikels liegen. Schauen Sie sich den Artikel über WebGL Modellansicht Projektion an, um zu sehen, wie nützlich sie sein kann.
In unserem Beispielcode haben wir eine Funktion definiert, um eine Matrix und einen Punkt zu multiplizieren — multiplyMatrixAndPoint():
Hinweis: Unsere Beispiele auf dieser Seite verwenden Zeilenvektoren, um Punkte darzustellen, und Rechtsmultiplikation, um Transformationsmatrizen anzuwenden. Das heißt, der obige Code führt point * matrix aus, wobei point ein 4x1-Zeilenvektor ist. Wenn Sie Spaltenvektoren und Linksmultiplikation verwenden möchten, müssen Sie die Multiplikationsfunktion entsprechend anpassen und jede unten eingeführte Matrix transponieren.
Beispielsweise sieht die unten eingeführte translationMatrix ursprünglich wie folgt aus:
Nach der Transposition sieht sie folgendermaßen aus:
Jetzt können wir mit der obigen Funktion einen Punkt mit der Matrix multiplizieren. Bei Verwendung der Identitätsmatrix sollte ein Punkt zurückgegeben werden, der mit dem Original identisch ist, da ein Punkt (oder eine andere Matrix), multipliziert mit der Identitätsmatrix, immer gleich sich selbst ist:
Dasselbe Ergebnis zurückzugeben ist nicht sehr nützlich, aber es gibt andere Arten von Matrizen, die hilfreiche Operationen auf Punkte ausführen können. Die nächsten Abschnitte werden einige dieser Matrizen demonstrieren.
Neben der Multiplikation einer Matrix und eines Punktes zusammen können Sie auch zwei Matrizen miteinander multiplizieren. Die Funktion von oben kann genutzt werden, um diesen Prozess zu unterstützen:
Schauen wir uns diese Funktion in Aktion an:
Warnung: Diese Matrixfunktionen sind aus Gründen der Erklärbarkeit geschrieben, nicht für Geschwindigkeit oder Speicherverwaltung. Diese Funktionen erstellen viele neue Arrays, was in Echtzeitoperationen aufgrund der Speicherbereinigung besonders teuer sein kann. In echtem Produktionscode wäre es am besten, optimierte Funktionen zu verwenden. glMatrix ist ein Beispiel für eine Bibliothek, die den Fokus auf Geschwindigkeit und Leistung legt. Der Schwerpunkt in der glMatrix-Bibliothek liegt darauf, Zielarrays zu haben, die vor der Update-Schleife allokiert werden.
Eine Translationsmatrix basiert auf der Identitätsmatrix und wird in 3D-Grafiken verwendet, um einen Punkt oder ein Objekt in eine oder mehrere der drei Richtungen (x, y und/oder z) zu bewegen. Die einfachste Art, eine Translation zu denken, ist wie das Aufnehmen einer Kaffeetasse. Die Kaffeetasse muss aufrecht gehalten und gleich orientiert werden, damit kein Kaffee verschüttet wird. Sie kann in die Luft gehoben und im Raum bewegt werden.
Man kann den Kaffee mit nur einer Translationsmatrix nicht wirklich trinken, denn um ihn zu trinken, muss man die Tasse kippen oder drehen können, um den Kaffee in den Mund zu gießen. Wir werden später den Typ Matrix betrachten (schlau genannt Rotationsmatrix), den Sie dafür verwenden.
Setzen Sie die Distanzen entlang der drei Achsen in die entsprechenden Positionen der Translationsmatrix und multiplizieren Sie sie dann mit dem Punkt oder der Matrix, die Sie durch den 3D-Raum bewegen müssen.
Ein wirklich einfacher Weg, um eine Matrix zu verwenden, ist die Verwendung von CSS matrix3d() transform. Zuerst richten wir ein einfaches <div> mit etwas Inhalt ein. Der Stil wird nicht gezeigt, aber es ist auf eine feste Breite und Höhe eingestellt und ist zentriert auf der Seite. Das <div> hat eine Transition für die Transformation gesetzt, sodass die Matrix animiert wird, was es einfach macht, zu sehen, was getan wird.
Schließlich werden wir für jedes Beispiel eine 4×4-Matrix erzeugen und dann den Stil des <div> aktualisieren, um eine Transformation darauf anzuwenden, die auf eine matrix3d gesetzt ist. Beachten Sie, dass die Matrix zwar aus 4 Reihen und 4 Spalten besteht, aber zu einer einzeiligen Folge von 16 Werten zusammengeklappt wird. Matrizen werden in JavaScript immer in eindimensionalen Listen gespeichert.
In einem Beispiel verwenden wir die translate()-Funktion aus dem Translationsmatrix-Abschnitt oben, um das <div> um 100 Pixel nach unten und um 50 Pixel nach rechts zu bewegen. Der z-Wert ist auf 0 gesetzt, sodass es sich nicht in der dritten Dimension bewegt.
Eine Skalierungsmatrix macht etwas größer oder kleiner in einer oder mehreren der drei Dimensionen: Breite, Höhe und Tiefe. In typischen (kartesischen) Koordinaten führt dies zu einer Streckung oder Kontraktion des Objekts in den entsprechenden Richtungen.
Die Menge der Änderung, die auf jede der Breite, Höhe und Tiefe angewendet wird, wird diagonal angeordnet, beginnend in der oberen linken Ecke und in Richtung der unteren rechten.
Eine Rotationsmatrix wird verwendet, um einen Punkt oder ein Objekt zu drehen. Rotationsmatrizen sehen ein wenig komplizierter aus als Skalierungs- und Transformationsmatrizen. Sie verwenden trigonometrische Funktionen, um die Drehung auszuführen. Auch wenn dieser Abschnitt die Schritte nicht bis ins kleinste Detail aufschlüsseln wird (sehen Sie sich diesen Artikel auf Wolfram MathWorld dafür an), betrachten Sie dieses Beispiel zur Illustration.
Zuerst hier ein Code, der einen Punkt um den Ursprung dreht, ohne Matrizen zu verwenden.
Es ist möglich, diese Art von Schritten in eine Matrix zu kodieren und sie für jede der x, y und z Dimensionen zu tun. Hier sind eine Reihe von Funktionen, die Rotationsmatrizen zurückgeben, um um jede der drei Achsen zu drehen. Ein großer Hinweis ist, dass keine Perspektive angewendet wird, sodass es sich möglicherweise noch nicht sehr 3D anfühlt. Die Flachheit ist gleichbedeutend mit dem, wenn eine Kamera wirklich nah an ein Objekt in der Ferne heranzoomt — der Sinn für Perspektive verschwindet.
Die eigentliche Stärke von Matrizen ergibt sich aus der Matrixzusammensetzung. Wenn Matrizen einer bestimmten Klasse miteinander multipliziert werden, bewahren sie die Geschichte der Transformationen und sind umkehrbar. Das bedeutet, wenn eine Translations-, Rotations- und Skalierungsmatrix alle zusammen kombiniert werden, wenn die Reihenfolge der Matrizen umgekehrt und erneut angewendet wird, dann werden die Originalpunkte zurückgegeben.
Die Reihenfolge, in der Matrizen multipliziert werden, ist bedeutend. Beim Multiplizieren von Zahlen ist a * b = c, und b * a = c, beide wahr. Beispiel: 3 * 4 = 12 und 4 * 3 = 12. In der Mathematik würden diese Zahlen als kommutativ beschrieben. Matrizen sind nicht garantiert gleich, wenn die Reihenfolge gewechselt wird, daher sind Matrizen nicht-kommutativ.
Ein weiteres Rätsel ist, dass die Matrixmultiplikation in WebGL und CSS in der umgekehrten Reihenfolge durchgeführt werden muss, in der die Operationen intuitiv geschehen. Beispielsweise, um etwas um 80% zu verkleinern, 200 Pixel nach unten zu bewegen und dann um den Ursprung um 90 Grad zu drehen, würde ungefähr so in Pseudocode aussehen:
transformation = rotate * translate * scaleDie Funktion, die wir zur Zusammensetzung unserer Matrizen verwenden werden, ist multiplyArrayOfMatrices(), die Teil der Sammlung von Hilfsfunktionen ist, die am Anfang dieses Artikels eingeführt wurde. Sie nimmt ein Array von Matrizen und multipliziert sie miteinander, wobei das Ergebnis zurückgegeben wird. In WebGL-Shader-Code wird dies in die Sprache integriert, und der *-Operator kann verwendet werden.
Schließlich ein weiterer Schritt, um zu zeigen, wie Matrizen funktionieren, besteht darin, die Schritte umzukehren, um die Matrix zurück zur ursprünglichen Identitätsmatrix zu bringen.
Matrizen sind wichtig, weil sie eine kleine Menge von Zahlen umfassen, die eine Vielzahl von Transformationen im Raum beschreiben können. Sie können in Programmen leicht gemeinsam genutzt werden. Unterschiedliche Koordinatenräume können mit Matrizen beschrieben werden, und eine gewisse Matrixmultiplikation wird einen Datensatz von einem Koordinatenraum zu einem anderen bewegen. Matrizen erinnern effektiv an jeden Teil der vorherigen Transformationen, die zur Erzeugung verwendet wurden.
Für den Einsatz in WebGL ist die Grafikkarte besonders gut darin, eine große Anzahl von Punkten im Raum mit Matrizen zu multiplizieren. Verschiedene Operationen wie das Positionieren von Punkten, das Berechnen von Beleuchtung und das Posieren animierter Charaktere basieren alle auf diesem grundlegenden Werkzeug.
Der Bauplan für ein besseres Internet.
Besuche die gemeinnützige Muttergesellschaft der Mozilla Corporation, die Mozilla Foundation.
Teile dieses Inhalts sind ©1998–2026 von einzelnen mozilla.org-Mitwirkenden. Inhalte sind verfügbar unter einer Creative-Commons-Lizenz.