Matrizen - perspektivische Projektion?

Hallo, ich beschäftige mich seit einer zeit mit Matrizen und der abbildung von 3d punkten auf einen 2d schirm.
Bitte, bitte, seit mir nicht böse, das ich mein problem hier nicht genau beschreibe - aber hier

http://forum.byte-welt.net/threads/10574-Rotations-und-sonstige-Matrizen/page6?p=73221#post73221

auf seite 3, dass ist das problem.

Und um es ganz kurz zu machen:

Kann man matrizen bilden die einen 3 dimensionalen punkt so umrechnen, das er perspektivisch richtig angezeigt wird?
Also: “weiter weg” = “kleiner” … oder ist das so nicht möglich? Ich dachte ja eine projektionsmatrix würde dafür reichen, tut es
ja aber nicht. (siehe thread link oben). Aber ich denke open gl benutzt da auch matrizen?..

Vielen Dank für Ratschläge… !

Natürlich geht das. Das ist doch nur eine Affine Transformation. Dass in y-Richtung (Rechtsdrehendes, kartesisches Koordinatensystem, y zeigt in die Bildebene) die gezeichneten Objekte “kleiner” wirken liegt ja allein daran, dass die gesamte Ebene skaliert wird. Also x- und z-Koordinate jeweils mit der y-Koordinate multipliziert. Für die Positionierung des Fluchtpunktes brauchst du dann noch eine lineare Transformation.
Ich würde (ohne jemals irgend etwas 3d-mäßiges programmiert zu haben) wie folgt vorgehen
[ol][li]Rotation um die Blickrichtung anzupassen
[/li][li]Lineare Transformation um den Fluchtpunkt (Bildschirmmitte) auf den Koordinatenursprung zu legen
[/li][li]Skalierung in Abhängigkeit von y um “kleiner werden” zu realisieren und gleichzeitig ggf. an den Bildschirmmaßstab anzupassen (konstanter Vorfaktor)[/ol]
[/li]Insgesamt also 3 Matrixmultiplikationen.

Und nun ist ein wenig Eigeninitiative von dir gefordert, das umzusetzen.

*** Edit ***

Was hast du überhaupt für einen mathematischen Kenntnisstand? Eigentlich ist das nur ziemlich einfache lineare Algebra.

Ganz einfach: es ist kompliziert! Wenn “perspektivisch” = Die Projektion von einem Fluchtpunkt F auf eine Sichtebene im R^3, dann kann das recht kompliziert sein (wenn du das von Hand berechnen willst)

Fang am besten mal damit an, dass du von F(0,0,1) (also z-Koordinate 1) auf die x-y-Ebene abbildest. Dazu musst du für einen Raumpunkt P(X,Y,Z) die Gerade durch P und Z bilden und dann mit der x-y-Ebene schneiden: das führt zu

G(t)=F+t(P-F) für die Gerade, dann setzt du die z-Koordinate 0 und findest 0=1+t(Z-1), also t=(-1)/(Z-1)

Der gesuchte Punkt ist dann G((-1)/(Z-1)) = F+(-1)/(Z-1)*P, das hängt nichtlinear von der z-Koordinate Z des Punktes P ab! Das geht nicht mit einer Matrix…

Jede affine oder lineare Abbildung wäre ja auf dem ganzen R^3 definiert, du siehst aber an der Formel schon, dass du die Punkte auf der Ebene durch F parallel zur Zielebene durch F gar nicht abbilden KANNST

Moin,

wir hatten das doch alles schon im Nachbarthread?

Viele Grüße
Fancy

Ich bin deinen Ausführungen jetzt nur teilweise gefolgt, einiges ist etwas verwirrend:

Das kann ich so nicht nachvollziehen. Eine Gerade durch P und Z? Das passt von den Dimensionen her doch schon gar nicht (Z ist eindimensional / skalar, P dreidimensional / Raumpunkt). Wie möchtest du den Raumpunkt auf die X-Y-Ebene projizieren? Ich hätte die Projektion so ausgeführt, dass ich von jedem Raumpunkt das Lot auf die X-Y-Ebene gefällt hätte und diesen neuen Punkt als den projizierten Punkt definiert hätte. Und das geschieht ganz einfach, indem man die Y-Koordinate auf 0 setzt.

Aber ist auch egal. Ich glaube verstanden zu haben, dass du die Projektion von einem Fluchtpunkt F auf die auf die X-Y-Ebene durchgerechnet hast. Das entspricht der Ausgangsstellung, die ich durch die Schritte 1 und 2 in meinem Beitrag herbeiführen wollte. Und bei der Berechnung kam heraus, dass Schritt 3 keine lineare Abbildung ist (das Z steht auf der falschen Seite des Bruchstriches :wink: ).

[QUOTE=cmrudolph]Ich bin deinen Ausführungen jetzt nur teilweise gefolgt, einiges ist etwas verwirrend:

Das kann ich so nicht nachvollziehen. Eine Gerade durch P und Z? [/QUOTE]

War ein Schreibfehler, wollte natürlich durch P und F schreiben :slight_smile:

Ok, jetzt versteh ich den Ansatz :slight_smile: Der Fluchtpunkt sollte dann idealerweise wohl hinter der Ebene liegen, auf die projiziert wird, um eine Spiegelung zu vermeiden.

[QUOTE=Fancy]Moin,

wir hatten das doch alles schon im Nachbarthread?

Viele Grüße
Fancy[/QUOTE]

ja, und genau das funktioniert ja nicht ganz…
also danke euch allen erstmal. Marco13 redet im nachbarthread jetzt von w division.
was meint er damit?

Genau den letzten Schritt - die Division von x,y und z durch w.

öhm… und was ist w?
tut mir echt leid aber das hast du glaub ich noch nicht erwähnt …

*** Edit ***

http://cumbia.informatik.uni-stuttgart.de/ger/research/proj/ito/materials/GIS-Slides-09-3D-Graphik.pdf

hier auf seite 12 wird die division auch erwähnt. (googel ftw) aber was genau w ist … finde ich gerade nicht…

Viel spezifischer als im Nachbarthread kann ich da aus dem Stegreif auch nicht werden: „Das ist ein Faktor, der durch die Perspektive Projection Matrix so verändert wird, dass, wenn man am Ende dadurch teilt, der perspektivische Effekt entsteht“. Aber vielleicht schau’ ich morgen mal nach einer anderer Erklärung… wenn’s sonst keiner macht :wink:

Ich hab den Link ja drüben schon mal gepostet. Da wird im Abschnitt „The perspective projection matrix“ erklärt, warum man eigentlich durch -z teilen muss und warum das eben dem w entspricht. Wenn es dazu eine konkrete Frage gibt, könnte man dazu vielleicht auch eine konkrete Antwort schreiben. :wink:

Viele Grüße
Fancy

Also x und y / -z ?
Gut ich versuchs