Laden...

vektor(x,y,z,w) transformation, bedeutung von "w"

Erstellt von Gehirnmann vor 19 Jahren Letzter Beitrag vor 19 Jahren 5.499 Views
G
Gehirnmann Themenstarter:in
2 Beiträge seit 2005
vor 19 Jahren
vektor(x,y,z,w) transformation, bedeutung von "w"

hallo allerseits.

ich bin etwas verwirrt von den drei vektor-transformations-funktionen bei D3D.
bisher brauchte ich die nicht, da ich immer auf mesh-ebene gearbeitet hab:

D3DXVec3Transform
D3DXVec3TransformCoord
D3DXVec3TransformNormal

mich wundert was so besonders am "w" der vektoren ist. eigentlich ist das doch nur ein "füllwert" um translation und rotation zu kombinieren, oder?

kann das mir mal jemand kurz erklären? bei der DX doku steht immer nur "w", aber nicht die bedeutung.

thx!

P
939 Beiträge seit 2003
vor 19 Jahren

Ich erinnere mich nur noch dunkel an die Computer Grafik Vorlesung. Koordinaten-Transformationen werden mittels Matrizen-Multiplikation durchgeführt. Transformationsmatrix A * Koordinaten-Vektor v = transformatierter Vektor v'. Multipliziert man mehrere Transformationsmatrizen miteinander, z.B. eine Drehungsmatriz und eine Skalierungsmatriz, ergibt das eine neue Matrix B für die zusammengesetzte Transformation. Das ist praktisch, es gibt aber ein Problem. In einer 3x3-Transformationsmatrix kann keine Translation (Verschiebung) angegeben werden. Damit alle möglichen Transformationen mit Matrizen-Multiplikation erschlagen werden können, muss die Berechnung auf 4x4-Matrizen und 4D-Vektoren erweitert werden. Das ist der Grund.
w wird immer mit 1.0 initialisiert. Ob das w' im Ergebnisvektor eine Bedeutung hat, weiss ich nicht.

eine Translationsmatrix sieht so aus (glaube ich, ist wie gesagt länger her):

|1 0 0 x|
|0 1 0 y|
|0 0 1 z|
|0 0 0 1|

Da sieht man, dass eine vierte Dimension w notwendig ist.

Gruss
Pulpapex

M
456 Beiträge seit 2004
vor 19 Jahren

Jo,
die 4. Koordinate braucht man für die Translation. Erweitert man die Tarnsformationsmatrix, so muss man auch die Vektoren um das neue Element erweitern, damit die Matrix-Vektor-Multiplikation weiter funktioniert.
Normalerweise wird w mit 1 initialisiert. Muss man aber nicht. w kann auch andere Werte enthalten. Um den Vektor wieder in seine "eigentliche" Form zu überführen, dividiert man einfach alle Elemente des Vektors durch w. Dieses 4. Vektorelement hat auch noch andere interessante Vorteile: Man kann damit unendlich lange Vektoren darstellen. Dazu wird w mit 0 initialisiert.
Für Schattenvolumen a la Doom 3 ist dies besonders wichtig, da diese "unendlich lang" sein müssen.

I am Jack's smirking revenge.
I am Jack's raging bile duct.
I am Jack's cold sweat.
I am Jack's complete lack of surprise.
I am Jack's broken heart.
I am Jack's wasted life.

G
Gehirnmann Themenstarter:in
2 Beiträge seit 2005
vor 19 Jahren

hmm.

also ist "w" die länge? nee oder? oder meinst du, dass wenn w=0.5 und ich habe v=(1,2,3), dann ist der vektor vorher (0.5,1,1.5) gewesen?

ich bin irgendwie immer noch nicht ganz im klaren wie sich überhaupt "w" verändern kann. auch wenn ich ne translation mache, bleibt doch w gleich oder?

zumal das mit den "unendlich langen" vektoren--- huii. wie kann das mit "0" dargestellt werden? (Beispiel?)

M
456 Beiträge seit 2004
vor 19 Jahren

also ist "w" die länge? nee oder? oder meinst du, dass wenn w=0.5 und ich habe v=(1,2,3), dann ist der vektor vorher (0.5,1,1.5) gewesen?

Du hast recht (0.5,1,1.5,0.5) wird in (1,2,3) umgerechnet. Als "Länge" kann man sich das weniger vorstellen. Es ist einfach eine Koordinate im 4D Raum.

ich bin irgendwie immer noch nicht ganz im klaren wie sich überhaupt "w" verändern kann. auch wenn ich ne translation mache, bleibt doch w gleich oder?

In dem Fall ja. Aber es gibt Transformationen die w ändern. Perspektivische Transformationen zum Beispiel.

umal das mit den "unendlich langen" vektoren--- huii. wie kann das mit "0" dargestellt werden? (Beispiel?)

Schattenvolumen sind typische Anwendungsgebiete. Wie ich oben schon gesagt habe, musst du die Vektorkomponenten durch w teilen. Wenn w=0 ist, so gehen die anderen Vektorkomponenten (Grenzwertig betrachtet) gegen Unendlich. Damit kannst du Objekte darstellen, die unendlich groß sind.

I am Jack's smirking revenge.
I am Jack's raging bile duct.
I am Jack's cold sweat.
I am Jack's complete lack of surprise.
I am Jack's broken heart.
I am Jack's wasted life.

P
939 Beiträge seit 2003
vor 19 Jahren

Wie maxE schon geschrieben hat, ist w die 4te Koordinate im 4-dimensionalen Raum. Das Teilen durch w entspricht übrigens einer Projektion des 4D-Raums in den 3D-Raum. Analog zu der Projektion des 3D-Raums in die Ebene, wo durch z geteilt wird. Nach dem Teilen sind alle w-Koordinaten gleich 1. Alle Punkte befinden sich also in einer "Ebene".

Nochmal zur Translation.
Um eine Translation auszuführen, muss ein Ortsvektor o (Punkt im Raum) und ein Verschiebungsvektor t addiert werden. Diese Addition lässt sich in einer 3x3-Matrix nicht angeben, da eine Multiplikation mit einer quadratischen Matrix sich immer auf alle Koordinaten auswirkt. z + 5, x und y bleiben gleich, ist also nicht möglich. Die Matrix wird also um ein unabhängiges Linearglied (heisst das so?) erweitert und schon ist man im 4D-Raum 😉.

Na eigentlich nicht, für eine Translation reicht eine rechteckige 3x4-Matrix aus, die weiterhin nur 3D-Vektoren transformiert.

Beispiel:


A ist die Einheitsmatrix, erweitert um das unabhängige Linearglied |1 2 3|'.

    |1 0 0 1|
A = |0 1 0 2|
    |0 0 1 3|

o ist ein Ortsvektor im Ursprung.

    |0|
o = |0|
    |0|

A*o verschiebt den Ortsvektor um die angegebenen Koordinaten |1 2 3|'.

      |1|
A*o = |2|
      |3|

Es gibt aber andere Transformationen, die 4x4 Matrizen benötigen. Stichwort Quarternionen: Quarternionen beschreiben (in der Computergrafik) die Rotation um einen 3D-Vektor. Es sind selbst Vektoren mit 4 Komponenten - x, y, z und Rotationswinkel. Quarternionen werden gerne statt der Rotation in drei Achsen eingesetzt, weil sie einfacher zu handhaben sind. Man stelle sich vor, ein Rotationsvektor ändert sich kontinuierlich und das Objekt soll sich dabei ruhig weiterdrehen. Sehr schwierig, dafür die normale Rotationsmatrix neu zu berechnen.

Und es gibt sicherlich noch einige weitere Anwendungsmöglichkeiten für 4D-Vektoren, neben denen, die maxE auch erwähnt hat.

M
456 Beiträge seit 2004
vor 19 Jahren

3x4 Matritzen sind aber im Kontext des Matrixkalküls eher unsinnig, da man zwei 3x4 Matrizen nicht miteinander multiplizieren kann. Man nimmt also 4x4 Matrizen, damit man alle Transformationen einheitlich behandeln kann.

I am Jack's smirking revenge.
I am Jack's raging bile duct.
I am Jack's cold sweat.
I am Jack's complete lack of surprise.
I am Jack's broken heart.
I am Jack's wasted life.

P
939 Beiträge seit 2003
vor 19 Jahren

Stimmt, daran habe ich eben gar nicht gedacht.