ich arbeite zurzeit an folgender Problemstellung. Ich habe ein Volumen, welches innerhalb einer Bounding Box im Raum liegt, die wie auch immer ausgerichtet ist. Das Volumen möchte ich per Ray Casting rendern. Die Bounding Box hat eine Kantenlänge von 1, kann jedoch mittels Model-View-Matrix auch verzerrt werden.
Mein grundlegendes Problem, kurz & knapp:
Ich muss die Blickrichtung zu einem Fragment der Bounding Box aus dem Screen Space in den Object Space transformieren.
Detaillierte Beschreibung:
Bei einer orthogonalen Projektion ist das leicht. Dafür nehme ich mir einen Richtungsvektor im Object-Space, nämlich ( 0, 0, -1 ) und transformiere diesen mit der Inversen der Model-View-Matrix der Bounding Box des Volumens. Dies ergibt mir den Richtungsvektor für den Strahl, welchen ich durch das Volumen rechne. Den Anfangspunkt des Strahls zu ermitteln ist ein Leichtes, da ich die Vertices bereits im Object-Space definiere.
Nun möchte ich aber, dass es auch mit perspektivischer Projektion verwendet werden kann. Diesbezüglich habe mir Folgendes überlegt. Der Strahl geht in den Bildschirm rein. Diese Richtung beschreibe ich im Screen-Space als ( 0, 0, 1 ). Plus Eins und nicht Minus Eins, da die Projektionsmatrix die z-Richtung zum View-Space umdreht. Und Null als erste und zweite Komponente entsteht aus der Überlegung, dass der Viewport eine Breite und eine Höhe hat und das Fragment innerhalb dieser abgebildet wird.
Diesen Richtungsvektor transformiere ich zunächst mit der Inversen der Projektionsmatrix, wodurch ich ihn im View-Space erhalte. Das Ergebnis davon wiederum wird mit der Inversen der Model-View-Matrix multipliziert, was mir den Richtungsvektor in den Object-Space transformiert liefern müsste: v = M^-1 * P^-1 * ( 0, 0, 1 ).
Wenn ich dies aber implementiere, sieht das Ergebnis mit perspektiver Projektion nicht richtig aus, es kommt zu leichten aber merkbaren Verzerrungen. Mit orthogonaler Projektion schaut es aber gut aus. Habe ich in meiner Überlegung einen Fehler oder etwas übersehen, oder muss ich den Fehler andern Ortes suchen?
Kann sein das ich nicht so richtig verstanden hab, was du bei deiner Lösung beschrieben hast, aber bei perspektivischer Projektion werden die Strahlen von einem Punkt aus in verschiedene Richtungen ausgesendet. D.h. der Vektor, den du da transformierst, muss für jeden Pixel unterschiedlich sein.
vielen Dank für deine Antwort. Das ist mir inzwischen auch in den Sinn gekommen. Jedoch komme ich partout nicht dahinter, wie der Vektor denn für jeden Pixel zu wählen ist. Kannst du mir da einen Hinweis geben?
Es sei v_screenspace der Vektor, der die Position eines Pixels im Screenspace beschreibt. Es sei w_screenspace der Vektor, der einen tieferen Pixel an derselben Stelle des Bildschirms zeigt.
Hab' mir jetzt nicht alles angeschaut, weil ich denke das deine erste Gleichung schon falsch ist.
Wenn du auf v_screenspace (0, 0, 0.1, 0) drauf addierst und das richtig wäre, könnte man auch jeden beliebigen anderen Wert statt 0.1 nehmen (würde ja nur die Länge von w_screenspace ändern). Also könnte man man rein theoretisch auch (0, 0, oo, 0) addieren (das "oo" soll für unendlich stehen). Wenn ich dann die Summe normiere (ändert nicht die Richtung) kommt da immer (0, 0, 1, 0) raus egal wie v_screenspace ist. Wenn v_screenspace aber z.B. (0.71, 0, 0.71, 0) ist, zeigt es aber in eine andere Richtung als es w_screenspace tut (ist denke ich offensichtlich). Das wäre ein Widerspruch, also kann die erste Gleichung nicht richtig sein.
Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.