Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

09.02.2010, 12:18

Modelviewmatrix

Hi,

simple Frage: Was kann ich mit einer invertierten und transponierten Modelviewmatrix anfangen bzw. was passiert mit einem Vektor im World Space, wenn ich ihn damit multipliziere?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

09.02.2010, 12:43

Die inverse transponierte einer Matrix verwendet man um Richtungsvektoren zu transformieren. Warum das so ist hab ich hier mal erklärt:
https://www.spieleprogrammierer.de/phpBB2/viewtopic.php?t=6463

Alyx

Treue Seele

Beiträge: 236

Wohnort: Hannover

Beruf: Head Of Software Development

  • Private Nachricht senden

3

09.02.2010, 12:45

Wie zum Beispiel die Normal-, Tangent und Binormal-Vektoren.

LG
Alyx

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

09.02.2010, 13:19

Re: Modelviewmatrix

Zitat von »"Sk!p"«

Hi,

simple Frage: Was kann ich mit einer invertierten und transponierten Modelviewmatrix anfangen bzw. was passiert mit einem Vektor im World Space, wenn ich ihn damit multipliziere?


Du musst hier aber aufpassen. Normal verwenden APIs wie OpenGL oder DirectX Homogene Koordinaten in ihrer Transformations-Pipeline. Um Vektoren (z.B. Oberflächennormalen) zu transformieren darf nur der lineare Teil der Modelviewmatrix berücksichtigt werden. D.h. du nimmst die invers-transponierte obere 3x3 Matrix der Modelviewmatrix!

In 95% der Fälle kannst du allerdings einfach die obere 3x3 Matrix verwenden ohne diese zu invertieren/transponieren, da diese Matrix häufig (meißtens) orthogonal ist und in diesem Fall gilt: A^{-1} = A^T => A^{-1T} = A^{TT} = A.

Alyx

Treue Seele

Beiträge: 236

Wohnort: Hannover

Beruf: Head Of Software Development

  • Private Nachricht senden

5

09.02.2010, 13:32

Zitat

D.h. du nimmst die invers-transponierte obere 3x3 Matrix der Modelviewmatrix!


Stimmt, jetzt wo du's sagst ;-).

LG
Alyx

6

09.02.2010, 16:50

Hochinteressant! Vielen Dank ;)

7

11.02.2010, 12:46

Vielleicht nochmal ein simples Anwendungsbeispiel dazu:

Quellcode

1
2
PARAM mvit[4] = {state.matrix.modelview.invtrans};
SUB eyevec, mvit[3], vertex.position;


Ich bin noch ziemlicher Anfänger was Shader angeht. Hier will man anscheinend den Eye-Vektor im World Space haben. Wieso ziehe ich jetzt aber die Position des aktuellen Vertex von der 4. Zeile (offensichtlich der Transformationsteil) der invtrans-Modelviewmatrix ab?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

8

11.02.2010, 13:14

Zitat von »"Sk!p"«


Hier will man anscheinend den Eye-Vektor im World Space haben.


Nein, man will den Eye-Vektor (= Vertexpos -- Ursprung Viewbasis) im Modelviewspace haben.

Zitat von »"Sk!p"«

Wieso ziehe ich jetzt aber die Position des aktuellen Vertex von der 4. Zeile (offensichtlich der Transformationsteil) ...


Die 4. Zeile ist die Verschiebung (= Translation).

Zitat von »"Sk!p"«

...der invtrans-Modelviewmatrix ab?


Die Übergangsmatrix wird invertiert um die Basisvektoren der Abbildung relativ zur "Modelspace" Basis zu bekommen (sonst kannst du keine sinnvollen Rechenoperationen mit z.B. der Vertexposition machen). Außerdem wird die Matrix transformiert, sodass du den Translationsteil als Vektor behandeln kannst (ARB hat eben ein "row-major" Layout für die Matrizen).
Und zum Schluss wird einfach der Vektor über die Subtraktion berechnet (Vektor zw. Punkten A und B = B-A).

9

14.02.2010, 12:20

Zitat von »"David_pb"«

Nein, man will den Eye-Vektor (= Vertexpos -- Ursprung Viewbasis) im Modelviewspace haben.


Ich dachte SUB dest, op1, op2 legt op1 - op2 in dest ab, also Ursprung Viewbasis - vertexpos?!

Zitat von »"David_pb"«


Die 4. Zeile ist die Verschiebung (= Translation).


Ja, das ist ein bug in meinem brain. Weil sich die Worte ziemlich ähnlich sind, benutz ich die unabsichtlich des öfteren synonym. Muss ich irgendwann mal patchen ^^

Zitat von »"David_pb"«

Die Übergangsmatrix wird invertiert um die Basisvektoren der Abbildung relativ zur "Modelspace" Basis zu bekommen (sonst kannst du keine sinnvollen Rechenoperationen mit z.B. der Vertexposition machen). Außerdem wird die Matrix transformiert, sodass du den Translationsteil als Vektor behandeln kannst (ARB hat eben ein "row-major" Layout für die Matrizen).
Und zum Schluss wird einfach der Vektor über die Subtraktion berechnet (Vektor zw. Punkten A und B = B-A).


Okay, ich versuchs mal zu rekapitulieren:

Modelviewmatrix bedeutet ja Objektkoordinaten -> Eye-Koordinaten. Wenn ich das invertiere müsste ich also den umgekehrten Weg bekommen. Das Transformieren wegen dem Layout ist klar.
Das was mir noch nicht klar ist, ist, wieso ich von Eye-Koordinaten ausgehe. Ich müsste doch im Moment im World Space sein, also sowas wie World -> Object brauchen oder nicht?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

10

14.02.2010, 12:31

Zitat von »"Sk!p"«

Zitat von »"David_pb"«

Nein, man will den Eye-Vektor (= Vertexpos -- Ursprung Viewbasis) im Modelviewspace haben.


Ich dachte SUB dest, op1, op2 legt op1 - op2 in dest ab, also Ursprung Viewbasis - vertexpos?!


Ja, gemeint war die Strecke zwischen Vertexposition und dem Ursprung. Ohne Richtungsangabe.


Zitat von »"Sk!p"«


Okay, ich versuchs mal zu rekapitulieren:

Modelviewmatrix bedeutet ja Objektkoordinaten -> Eye-Koordinaten. Wenn ich das invertiere müsste ich also den umgekehrten Weg bekommen. Das Transformieren wegen dem Layout ist klar.
Das was mir noch nicht klar ist, ist, wieso ich von Eye-Koordinaten ausgehe. Ich müsste doch im Moment im World Space sein, also sowas wie World -> Object brauchen oder nicht?


Was meinst du mit "du bist im Moment im World Space"? Die Vertexposition befindet sich im Objektspace, du hast überhaupt kein Bezug zum "Worldspace".

Werbeanzeige