Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Mär 28, 2024 09:24

Foren-Übersicht » Programmierung » Mathematik-Forum
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Do Aug 11, 2011 16:05 
Offline
DGL Member

Registriert: Do Jul 15, 2010 14:41
Beiträge: 5
Hallo Leute,

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?

Danke im Voraus.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Aug 13, 2011 23:20 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
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.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Aug 22, 2011 13:37 
Offline
DGL Member

Registriert: Do Jul 15, 2010 14:41
Beiträge: 5
Hallo Schläfer,

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?

Schönen Gruß


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Aug 22, 2011 15:27 
Offline
DGL Member

Registriert: Do Jul 15, 2010 14:41
Beiträge: 5
Also ich hab nochmal drüber siniert ;)

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.

w_screenspace = v_screenspace + ( 0, 0, 0.1, 0 ) (1)

Die gesuchte Richtung des Strahls ist ray_dir = w_objectspace - v_objectspace. (2)

Transformieren wir die beiden Vektoren zunächst in den View-Space:

v_viewspace = ProjectionMatrix^-1 * v_screenspace
w_viewspace = ProjectionMatrix^-1 * w_viewspace


Und dann in den Object-Space:

v_objectspace = ModelViewMatrix^-1 * ProjectionMatrix^-1 * v_screenspace
w_objectspace = ModelViewMatrix^-1 * ProjectionMatrix^-1 * w_screenspace


Nun bestimmen wir die Richtung des Strahls nach (2):

ray_dir = ModelViewMatrix^-1 * ProjectionMatrix^-1 * w_screenspace - ModelViewMatrix^-1 * ProjectionMatrix^-1 * v_screenspace = ModelViewMatrix^-1 * ProjectionMatrix^-1 * ( w_screenspace - v_screenspace ) (Linearität)

Nach (1) gilt nun:

ray_dir = ModelViewMatrix^-1 * ProjectionMatrix^-1 * ( v_screenspace + ( 0, 0, 0.1, 0 ) - v_screenspace ) = ModelViewMatrix^-1 * ProjectionMatrix^-1 * ( 0, 0, 0.1, 0 )

Damit wäre gezeigt, dass der zu transformierende Vektor für alle Pixel gleich ist!


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Sep 08, 2011 22:06 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
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.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Foren-Übersicht » Programmierung » Mathematik-Forum


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 15 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.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.028s | 17 Queries | GZIP : On ]