Spalten einer Matrix
-
Hallo,
ich arbeite gerade mit Direct3D und folglich viel mit Matrizen. Wenn man in D3D nen Vektor v in einen Vektor v' mittels Matrix transformieren will, schreibt man:
v' = v*M, da Direct3D Zeilenvektoren verwendet.Ich weiß, dass die Spalten einer Matrix die Bilder der Basisvektoren sind. Dies gilt also auch für M.
Wenn man jetzt aber statt Zeilenvektoren Spaltenvektoren benutzt (wie in OpenGL), dann schreibt man ja:
u' = N*u (quasi die Gleichung von oben transponiert) [N ist dasselbe wie M, nur transponiert]Was ich nun nicht verstehe: Der Satz "Die Spalten einer Matrix sind die Bilder der Basisvektoren" hat doch allgemeingültigen Charakter, also stimmt immer, oder?
Aber die Spalten von M wurden ja zu Zeilen in N. Also müssten in N ja die ZEILEN die Bilder der Basisvektoren sein. Oder wie muss ich das verstehen?
-
wenn ich deine frage richtig versteh, dann ist die antwort: jo
kommt halt drauf an, welche elemente der matrix als koordinaten element (x,y,z) interpretiert werden.
eine matrix soll eine transformation sein, d.h. bei multiplikation mit einem vektor soll wieder ein vektor herauskommen, also ne homogene transformation. aufgrund der matritzenmultiplikationsregeln muss der vektor also entsprechend vor oder nach der matrix stehen. viel mehr steckt nicht dahinter.
ob man nu spalten- oder zeilendarstellung bevorzugt, liegt einzig am geschmack. und eventuell der verwendung und entsprechend möglichen optimierung.
-
Da meine Frage offenbar nicht so ganz verständlich war bring ich mal ein Beispiel:
Wenn ich in D3D (row-major form) einen Vektor v um die x-Achse rotieren will, dann sieht das so aus:
| 1 0 0 0| | 0 cosA sinA 0| v * | 0 -sinA cosA 0| | 0 0 0 1|
Nach dem Satz (im folgenden nur noch SatzA) "die Spalten der Matrix sind die Bilder der Einheitsvektoren" ist also z.B. (1,0,0) das Bild des Einheitsvektors (1,0,0), was ja Sinn macht, da die x-Achse bei ner Drehung um die x-Achse gleich bleibt. Das Bild des y-Achsen Basisvektors (0,1,0) wird zu (0,cosA,-sinA).
Wenn ich nun eine column-major form (OpenGL) habe, dann sieht das ganze so aus:
| 1 0 0 0| | 0 cosA -sinA 0| | 0 sinA cosA 0| * v | 0 0 0 1|
Die Matrix wurde also transponiert und v wird von rechts multipliziert. Nach SatzA müsste jetzt aber das Bild des y-Achsen Basisvektors (0,1,0) lauten: (0,cosA, SinA). Das wäre ein anderes Bild als bei der Matrix oben! Aber das kann doch garnicht sein. Rotation ist doch Rotation, egal ob ich nun Zeilenvektoren (D3D) oder Spaltenvektoren (OpenGL) habe. Von der Logik her müsste bei der unteren Matrix ja eigentlich gelten: "Die ZEILEN der Matrix sind die Bilder der Einheitsvektoren"
Meine konkreten Fragen:
Gilt SatzA also nicht immer?
Sind also wirklich bei der Matrix unten die ZEILEN die Bilder der Basisvektoren?
Falls nein: Bitte genauere Erklärung :xmas1:
-
Dein Satz ist leider ziemlich schwammig formuliert.
Der Knackpunkt zum Verständnis ist wohl sich mal klar zu machen von was das überhaupt die Bilder sein sollen. Offensichtlich von irgendeiner Abbildung, aber von welcher?Eine Matrix ist nämlich keine Abbildung und hat daher auch keine Bilder. Aber man kann mit Matrizen Abbildungen beschreiben. Einigt man sich darauf, dass die Matrix M die Abbildung f(x) = M*x beschreibt, dann gilt Dein Satz.
Einigt man sich darauf, daß M die Abbildung f(x) = x*M beschreibt, dann ist der Satz so falsch und es müßte Zeilen statt Spalten heißen damit er richtig ist.