Perspektivische Transformation ohne Projektion

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Benutzeravatar
eXile
Establishment
Beiträge: 1136
Registriert: 28.02.2009, 13:27

Perspektivische Transformation ohne Projektion

Beitrag von eXile »

Hi,

ich bin grad ein Problem am beackern: Was ist der beste Weg, um eine Menge von Vertices zwar pespektivisch zu transformieren, aber keine abschließende Projektion durchzuführen?
Anschaulich will ich folgendes: Man schaut von einer fest gewählten Position in die Szene. Dann rotiert man die Szene, und die Vertices sind dann so verzerrt im Raum angeordnet, wie sie bei der perspektivischen Projektion zuvor zu sehen gewesen wären (d.h. x- und y-Koordinate bereits durch z dividiert, jedoch bleiben die alten z-Koordinaten erhalten).
Da es nicht sinnvoll wäre, jeden Vertex einmal vorzutransformieren, wollte ich eine geeignete Model-Matrix basteln. Das Problem ist, dass der z-Wert ja erhalten bleiben soll, also vor der Division durch z in der z-Koordinate sozusagen z² stehen müsste. Das kriegt man so aber selbst mit einer 4x4-Matrix IMHO nicht hin.

Hat jemand schon von so einem Problem gehört, oder kann mir jemand sonst irgendwie helfen?

PS: Alles ist zur Zeit fixed-function, also ist nichts mit Vertex-Shadern.
Zuletzt geändert von eXile am 08.09.2010, 21:23, insgesamt 1-mal geändert.
Benutzeravatar
Schrompf
Moderator
Beiträge: 4859
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Perspektivische Transformation ohne Projektion

Beitrag von Schrompf »

Die Grafikkarte dividiert am Ende .xyz durch .w. Wenn Du also eine Projektionsmatrix erzeugst, die in die w-Komponente eine 1 einträgt, wird damit die perspektivische Division faktisch deaktiviert. Wie genau das geht, hängt von Deinem Matrix-Speicherlayout ab: entweder die vierte Spalte oder die vierte Zeile auf (0, 0, 0, 1) setzen.

Wenn ich aber Deine Beschreibung so lese, verstehe ich nichtmal, was Du eigentlich beabsichtigst.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
eXile
Establishment
Beiträge: 1136
Registriert: 28.02.2009, 13:27

Re: Perspektivische Transformation ohne Projektion

Beitrag von eXile »

Mhh ... dann ist wohl die Zeit für heldenhafteste Paint-Künste gekommen:

Bild

Das ist das Ergebnis, was ich erzielen will. Im linken Bild wurde eine Kameraposition (Position, Richtung und Up-Vektor) und eine Projektionsart (Perspektivische Projektion) gegeben. Diese beiden Dinge werden sich nicht mehr verändern. Nun ist man im rechten Bild selber als "dritter Beobachter" unterwegs, und betrachtet die Szene so, wie der Beobachter links sie sieht. Nur kann dieser "dritte Beobachter" die Szene frei rotierten, sich frei in ihr bewegen, etc. Es ist also de-facto die linke Szene, perspektivisch transformiert, jedoch nicht projeziert.

Ich hoffe das erläuter das Problem hinreichend ;)
Benutzeravatar
Schrompf
Moderator
Beiträge: 4859
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Perspektivische Transformation ohne Projektion

Beitrag von Schrompf »

Das geht nach meinem Verständnis nicht. Nach der Projektion gibt es kein 3D mehr, nur noch 2D mit einem zusätzlichen nichtlinearen Parameter z, über den die Interpolation der Vertexdaten innerhalb des Dreiecks verzerrt wird. Das sind aber keine Raumkoordinaten mehr, Rotieren kannst Du da eigentlich nur noch im Bildbereich.

Ich frag mal anders: was willst Du eigentlich erreichen?
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: Perspektivische Transformation ohne Projektion

Beitrag von CodingCat »

Naja, vielleicht möchte eXile ja genau im Bildbereich rotieren. Allerdings müsst dann wohl die erste Division im Vertex Shader von Hand erfolgen.

Code: Alles auswählen

vVertexPos = mul(vVertexPos, mFixedWVP); // "feste" Transformation (mit mFixedWVP aber auch veränderbar)
vVertexPos /= vVertexPos.w; // 1. Division von Hand ("feste" Projektion)
vVertexPos = mul(vVertexPos, mDynamicWVP); // "dynamische" Transformation (projezierte Szene aus anderer Perspektive)
/* 2. Division ("dynamische" Projektion) automatisch zwischen Vertex- und Pixel-Shader */
Nach der ersten Projektion liegt die Szene natürlich im Bereich [(-1;-1;0); (1;1;1)] vor, mit der Weltmatrix müsste die dann wieder auf gewünschte Skalierung gebracht werden. Alleine mit Matrizen ist da denke ich nichts zu machen, da nach der ersten Projektionsdivision noch einmal transformiert werden muss.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
eXile
Establishment
Beiträge: 1136
Registriert: 28.02.2009, 13:27

Re: Perspektivische Transformation ohne Projektion

Beitrag von eXile »

Ok danke euch allen ;) Dann werd ich mal anfangen, alles auf Shader umzustellen.

Zum Sinn und Zweck: Es sollte im Endeffekt ne Demo-Applikation werden, in der man die Grundlagen von perspektivischen Projektionen erklärt bekommt.
Antworten