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.
Perspektivische Transformation ohne Projektion
Perspektivische Transformation ohne Projektion
Zuletzt geändert von eXile am 08.09.2010, 21:23, insgesamt 1-mal geändert.
- Schrompf
- Moderator
- Beiträge: 5163
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas
- Wohnort: Dresden
- Kontaktdaten:
Re: Perspektivische Transformation ohne Projektion
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.
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.
Re: Perspektivische Transformation ohne Projektion
Mhh ... dann ist wohl die Zeit für heldenhafteste Paint-Künste gekommen:

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 ;)
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 ;)
- Schrompf
- Moderator
- Beiträge: 5163
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas
- Wohnort: Dresden
- Kontaktdaten:
Re: Perspektivische Transformation ohne Projektion
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?
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.
- CodingCat
- Establishment
- Beiträge: 1857
- Registriert: 02.03.2009, 21:25
- Wohnort: Student @ KIT
- Kontaktdaten:
Re: Perspektivische Transformation ohne Projektion
Naja, vielleicht möchte eXile ja genau im Bildbereich rotieren. Allerdings müsst dann wohl die erste Division im Vertex Shader von Hand erfolgen.
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.
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 */
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Re: Perspektivische Transformation ohne Projektion
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.
Zum Sinn und Zweck: Es sollte im Endeffekt ne Demo-Applikation werden, in der man die Grundlagen von perspektivischen Projektionen erklärt bekommt.