2009-02-26 12 views
3

ichRückwärtsprojektion Perspektive

worldview_inverse * (projection_inverse * vector) 

mit Platz auf dem Bildschirm zu verwandeln Koordinaten in Weltraumkoordinaten. ich davon aus, dass

(x,y,1,1) 

zu einem Punkt auf der weiten Ebene verwandeln würde, während

(x,y,-1,1) 

auf der nahen Ebene zu einem Punkt verwandelt, und Verbinden der Linie I alle Objekte in der Ansicht abfragen Kegelstumpf, der die Linie schneidet. Nach der Transformation teile ich die resultierenden Punkte durch ihre jeweilige .w-Komponente. Dies funktioniert für die ferne Ebene, aber der Punkt auf der nahen Ebene wird irgendwie in den Ursprung des Weltraums transformiert.

Ich denke, das hat mit den w-Komponenten von 1 zu tun Ich füttere in die umgekehrte Projektion, denn normalerweise ist es 1 vor der Projektion, nicht nach, und ich mache die Rückprojektion. Was mache ich falsch?

+0

Ich denke, Sie brauchen noch mehr Beispielcode. Vor allem der Teil, der Ihren Nahpunkt auf den Ursprung setzt. –

+0

Könnten Sie auch die Projektionsmatrix angeben, die Sie verwenden? Ist es ausgeglichen? – Coincoin

Antwort

4

Ich weiß, dass dies nur eine Problemumgehung ist, aber Sie können den nahen Ebenenpunkt ableiten, indem Sie nur den fernen Punkt und die Betrachtungsposition verwenden.

near_point = view_position 
      + (far_point - view_position) * (near_distance/far_distance) 

Für Sie echtes Problem. Erstens, vergiss nicht, durch W zu teilen! Haben Sie, abhängig von Ihrer Projektionsmatrix, versucht (x, y, 0,1) im Gegensatz zu z = -1.

near_point = worldview_inverse * (projection_inverse * vector) 
near_point /= near_point.W 
+0

Ja, ich dachte darüber nach, aber jetzt interessiert mich die Mathe-Seite des ursprünglichen Problems;) – heeen

+0

Hehe, ja Entschuldigung. Ich habe meine Antwort aktualisiert, um Ihr wirkliches Problem anzugehen. – Coincoin