Seite 1 von 2

Projektions-Matrix

Verfasst: Di Feb 01, 2011 7:42 pm
von Empire
HI zusammen,
Als Schulprojekt hab ich schon ein kleines "3D" Spiel geschrieben.
(in etwa so: http://armorgames.com/play/7558/starlight-xmas)
Jetzt will ich ein bisschen mehr mit 3D machen.
Dafür bräuchte ich aber eine Projektions-Matrix.
Heute und gestern hab ich nichts anderes gemacht wie danach zu googeln,
hab aber nichts gefunden.

Kann mir bitte jemand erklären wie sich eine Projektions-Matrix zu-
sammen setzt?
Matrix-Multiplikation kann ich.

mfg
Empire

Re: Projektions-Matrix

Verfasst: Di Feb 01, 2011 9:14 pm
von Kerli
Willst du dir die Projektionsmatrix selber herleiten und erstellen oder einfach nur eine vorgefertigte Funktion für ein bestimmtes Framework wissen? Wenn du es dir selber herleiten möchtest dann zeichne dir das ganze doch einmal in 2D von oben auf und überlege dir welche Zusammenhänge durch vorhandene ähnliche Dreiecke sich ausnützen lassen bzw. was das Ergebnis sein sollte wenn du die Matrix und einen Vektor einer virtuellen Position in Bildschirmkoordinaten umrechnen möchtest.

Re: Projektions-Matrix

Verfasst: Mi Feb 02, 2011 12:14 am
von Xin
Empire hat geschrieben:Jetzt will ich ein bisschen mehr mit 3D machen.
Dafür bräuchte ich aber eine Projektions-Matrix.
Heute und gestern hab ich nichts anderes gemacht wie danach zu googeln,
hab aber nichts gefunden.
Was genau brauchst Du denn?
Empire hat geschrieben:Kann mir bitte jemand erklären wie sich eine Projektions-Matrix zu-
sammen setzt?
Matrix-Multiplikation kann ich.
Grundsätzlich stellt sich die Frage, wofür eine Projektionsmatrix da ist. Es wird damit ausgerechnet, wenn ein Punkt bei (a, b, c) liegt, wohin er projiziert wird. Bei der Identität

Code: Alles auswählen

1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
wird die Koordinate

Code: Alles auswählen

1    X-Koordinate
0    Y
0    Z
1    Weight
auf den Punkt

Code: Alles auswählen

1   1 0 0 0     1
0   0 1 0 0     0
0 * 0 0 1 0  = 0
1   0 0 0 1     1
abgebildet. Wir haben die identische Abbildung.

Wenn Du nun das Bild in X-Richtung strecken möchtest, muss die X Koordinate gestreckt werden.

Code: Alles auswählen

1   2 0 0 0     2
0   0 1 0 0     0
0 * 0 0 1 0  = 0
1   0 0 0 1     1
Der Punkt 1/0/0 wird also nach 2/0/0 projiziert.

So kannst Du auch einfach die Achsen vertauschen:

Code: Alles auswählen

1   0 1 0 0     0
0   1 0 0 0     1
0 * 0 0 1 0  = 0
1   0 0 0 1     1
Der Punkt 1/0/0 wird also nach 1/0/0 projiziert.

Durch eine Rotationsmatrix kannst Du nun die Darstellung im Raum verdrehen. Skalierung findet über

Code: Alles auswählen

X 0 0 0
0 Y 0 0
0 0 Z 0
0 0 0 1
statt, Translation (Verschiebung ist unabhängig von der Koordinate):

Code: Alles auswählen

1 0 0 X
0 1 0 Y
0 0 1 Z
0 0 0 1
Und die Rotation beeinflusst den Großteil der Matrix.

Code: Alles auswählen

R R R 0
R R R 0
R R R 0
0 0 0 1
Wie sich die Zentralprojektion daraus ergibt, muss ich aber ggfs. nochmal nachschlagen.

Re: Projektions-Matrix

Verfasst: Mi Feb 02, 2011 4:17 pm
von Empire
Ich meinte wie ich die 3D Koordinaten auf meinen 2D Bildschirm bekomme.
Dachte dazu bräuchte ich die Projektions-Matrix.

mfg
Empire

Re: Projektions-Matrix

Verfasst: Mi Feb 02, 2011 4:38 pm
von Kerli
Empire hat geschrieben:Dachte dazu bräuchte ich die Projektions-Matrix.
Richtig. Die Frage ist jedoch immer noch, willst du wissen wie du dir herleitest wie das funktioniert, oder interessiert dich nur das Endergebnis, also nur was du wo in die Matrix eintragen musst. Ich hab das vor Ewigkeiten schon einmal selbst hergeleitet und ein bisschen (wirklich nur ein bisschen :)) mitgeschrieben: http://wiki.tomprogs.at/math:matrix

Re: Projektions-Matrix

Verfasst: Mi Feb 02, 2011 4:40 pm
von Xin
Empire hat geschrieben:Ich meinte wie ich die 3D Koordinaten auf meinen 2D Bildschirm bekomme.
Dachte dazu bräuchte ich die Projektions-Matrix.
Erstmal musst Du klarstellen, welche Projektion Du überhaupt haben möchtest - entsprechend muss man die Projektionsmatrix aufbauen.
Ansonsten ist das nur die Multiplikation des Modellpunktes mit der Projektionsmatrix.

Re: Projektions-Matrix

Verfasst: Mi Feb 02, 2011 7:02 pm
von Empire
Also ich glaube ich brauche eine perspektivische Projektion.
Ich will das Objekt nicht Strecken, verschieben oder die Größe ver-
ändern sondern nur für den Bild "bereit" machen.
Mich interesiert nicht nur das Ergebnis sondern auch wie ich da
hin komme.

Code: Alles auswählen

Lefthand
        width2near 0 0 0 0 height2near 0 0 0 0 near−farnear+far near−far2nearfar 0 0 −1 0          
xt=xwidth2near
yt=yheight2near
zt=−zfarfar−near+far−nearfarnear
w=z
Ich glaube das ist es(es kommt den Googel Treffern am nähsten),
kann mir das bitte jemand erklären

mfg
Empire

EDIT:
OK man sieht es nicht sonderlich gut. es stammt von hier http://wiki.tomprogs.at/math:matrix
Es ist das Lefthand ding. Achja wo ist der unterschied zum Righthand?

Re: Projektions-Matrix

Verfasst: Mi Feb 02, 2011 7:54 pm
von Xin
Empire hat geschrieben:Also ich glaube ich brauche eine perspektivische Projektion.
Ich will das Objekt nicht Strecken, verschieben oder die Größe ver-
ändern sondern nur für den Bild "bereit" machen.
Definiere "bereit" machen?

Womit arbeitest Du überhaupt. Wenn es OpenGL ist, was spricht gegen gluPerspective?
Empire hat geschrieben:OK man sieht es nicht sonderlich gut. es stammt von hier http://wiki.tomprogs.at/math:matrix
Es ist das Lefthand ding. Achja wo ist der unterschied zum Righthand?
Bei Matrizen ist es wichtig, dass A*B != B*A ist.

Re: Projektions-Matrix

Verfasst: Mi Feb 02, 2011 8:55 pm
von Dirty Oerti
Bei Matrizen ist es wichtig, dass A*B != B*A ist.
Außer bei speziellen Drehmatrizen ;)

Re: Projektions-Matrix

Verfasst: Do Feb 03, 2011 1:06 am
von Kerli
Dirty Oerti hat geschrieben:
Bei Matrizen ist es wichtig, dass A*B != B*A ist.
Außer bei speziellen Drehmatrizen ;)
Oder noch viel einfacher bei der Nullmatrix oder Einheitsmatrix :P
Empire hat geschrieben:Mich interesiert nicht nur das Ergebnis sondern auch wie ich da
hin komme.
Bevor ich jetzt lange hier herumschreibe habe ich mir jetzt die Mühe gemacht das gleich einmal ins Wiki zu stellen: http://proggen.org/doku.php?id=theory:m ... projection
Empire hat geschrieben:Es ist das Lefthand ding. Achja wo ist der unterschied zum Righthand?
Halte die linke Hand vor dich und bilde mit Daumen, Zeigefinger und Mittelfinger ein Koordinatenystem. Dabei zeigt der Daumen in positive z-Richtung, der Zeigefinger in positive y-Richtung und der Mittelfinger in positive x-Richtung. Jetzt wiederholst du das ganze mit der rechten Hand und wirst sehen, das dabei die Richtung der z-Achse umgedreht ist.