Hi Ich habe eine Frage zu Matrizen. Ich habe bereits die beiden Tutorials durchgelesen und viel bei Google gesucht, jedoch die Information die ich suche nicht gefunden. Es kann sein das ich die Information überlesen habe. Ich verstehe nicht für was der eine äußere Teil gut ist:
Zu diesem rechten äußeren Rand finde ich keine Informationen. Es wäre nett wenn mir jemand erklären könnte wie ich diese mit einem 3 Dimensionalen Vektor verechnen muss.
Registriert: Mi Aug 14, 2013 21:17 Beiträge: 588
Programmiersprache: C++
Mathematisch gesehen ist eine Multiplikation von 4x4-Matrix und 3-komponentigem Vektor nicht möglich. In einer 3x3-Matrix lässt sich jedoch keine Translation unterbringen* (weshalb deine Grafik eigentlich falsch ist*). Daher verwendet man in der 3D-Grafik einen Trick: Man ergänzt den 3er-Vektor um eine vierte Komponente (meist "w"), die man auf 1.0 setzt. Den 4er-Vektor kann man dann nämlich mit einer 4x4-Matrix (in der auch Translation enthalten sein kann) transformieren. (Mathematische Details hier.)
Solange es dir nur um Translation, Rotation und Skalierung geht, würde eigentlich eine 4x3-Matrix reichen, wie du schon erkannt hast. Matrizen haben in OpenGL aber auch andere Aufgaben, z.B. wird auch das Frustum als 4x4-Matrix gespeichert. Dabei werden alle Spalten und Zeilen gebraucht (siehe gluPerspective und glOrtho). Wenn man nun auch für die ModelView-Matrix (wo man üblicherweise nur Translation, Rotation & Skalierung braucht) das Format 4x4 wählt, hat das den Vorteil, dass man sie ohne Konvertierungen mit der Frustum-Matrix multiplizieren kann und als Ergebnis wieder eine 4x4-Matrix bekommt. Die Vertices können nun alle mit diesem Ergebnis multipliziert werden - also nur eine Transformation pro Vertex statt zwei.
Edit: *) Stimmt im 3D-Fall, jedoch nicht für den 2D-Fall, wie Lord Horazont richtigerweise anmerkt.
_________________ So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)
Zuletzt geändert von glAwesome am Mo Mär 03, 2014 11:07, insgesamt 1-mal geändert.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
glAwesome hat geschrieben:
Mathematisch gesehen ist eine Multiplikation von 4x4-Matrix und 3-komponentigem Vektor nicht möglich. In einer 3x3-Matrix lässt sich jedoch keine Translation unterbringen (weshalb deine Grafik eigentlich falsch ist). Daher verwendet man in der 3D-Grafik einen Trick: Man ergänzt den 3er-Vektor um eine vierte Komponente (meist "w"), die man auf 1.0 setzt. Den 4er-Vektor kann man dann nämlich mit einer 4x4-Matrix (in der auch Translation enthalten sein kann) transformieren. (Mathematische Details hier.)
Ich möchte folgendes Anmerken: mit dem gleichen Trick wie OpenGL ihn für 3D verwendet, kann man für 2D in einer 3×3 Matrix sehr wohl Translation unterbringen, wie es wohl in dem Bild gezeigt wird (der Lineare Anteil ist eine Drehmatrix).
Ansonsten: Generell geht Translation nicht mit Matrizen, da es sich um lineare Abbildungen handelt (und Translation affin linear ist). Um das zu beheben, wendet OpenGL den w=1-Trick an: damit wird die letzte Zeile der Matrix einfach auf den Vektor addiert.
grüße, Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Mo Nov 08, 2010 18:41 Beiträge: 769
Programmiersprache: Gestern
Die Grafik ist falsch:
Multiplizierst du eine Matrix(n,n) mit einen Vektor(n) dann erhaelst du einen neuen Vektor(n). Jede Komponente dieses neuen Vektor entricht dabei dem Punkprodukt aus Matrix-Zeile mit dem Urspruenglichen Vektor. Sprich um eine Translation einen Zweidimensionalen Vektors darzustellen brauchst du eigentlich eine Matrix(n+1,n). Fuer einen 2D Vektor sieht das also wie folgt aus:
Genau das ist doch auch in der Grafik oben zu sehen?
Das man die Vekoren um "w" ergänzt, nennt sich übrigens homogene Koordinaten. Zb. bei Normalen wird w=0 gesetzt. Eine Verschiebung macht dort nämlich keinen Sinn.
Die rechte Spalte ist für die perspektivische Transformation gut. Die resultierenden Koordinaten X, Y, Z werden abschließend durch den "W"-Wert geteilt.
Registriert: Mo Nov 08, 2010 18:41 Beiträge: 769
Programmiersprache: Gestern
Theoretisch ja, praktisch nein. Auf dem Papier hast du einmal halt die Multiplikation nach Spalten (Column Major) (OpenGL, Blender) und halt die Multiplikation mit Zeilen (Row Major) (DirectX,Maya). Der einzig wirkliche Unterschied ist halt das du bei CM die Matrix mal Vektor rechnest und bei RM den Vektor mal Matrix. Ansonsten ist es halt, meiner Meinung nach, reine Geschmackssache, man muss es halt nur richtig Dokumentieren (*hust* nicht so wie Biene *hust*).
Daher ist V*M
RM
Code:
x' = x * c00 + y * c10 + z * c20
y' = x * c01 + y * c11 + z * c21
z' = x * c02 + y * c12 + z * c22
und M*V
CM
Code:
x' = c00 * x + c01 * y + c02 * z
y' = c10 * x + c11 * y + c12 * z
z' = c20 * x + c21 * y + c22 * z
wenn also in der Formel MA*V*MB steht musst du also erst CM und dann RM rechnen. Oder am besten gleich die Fehlermeldung werfen.
OpenGL orientiert sich hier übrigens nicht an uns Programmierer sondern am Mathematiker und dort ist leider CM die bevorzugte Methode (sollte klar sein warum). Das Ganze wird noch Verwirrender wenn man bedenkt das in OpenGL noch ein kleiner Fehler aus Iris Zeiten steck. Denn früher wurde tatsächlich RM benutzt und daher ist das Speicherlayout auch immer noch genau wie bei RM.
Komischerweise ist DX hier die einzige API die ich kenne wo alles von Vorne bis Hinten zusammenpasst (irgendwas müssen die ja auch mal besser machen lol)
Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.