Herleitung der perspektivischen (linkshändigen) Projektionsmatrix

Zum Verständnis der Herleitung ist es nötig zu wissen was Homogene Koordinaten sind bzw. wie man mit ihnen arbeitet. Wer das bereits weiß kann den nächsten Abschnitt überspringen und gleich bei der Herleitung weiter lesen. Wer mit diesem Begriff nichts oder wenig anfangen kann sollte den nächsten Abschnitt unbedingt zuerst lesen und verstehen.

Homogene Koordinaten

In der Computergrafik werden häufig dreidimensionale Vektoren mit Hilfe von 4×4 Matrizen transformiert, da gewisse Transformationen wie beispielsweise eine perspektivische Projektion nicht möglich wären. Eine Multiplikation eines drei Komponenten Vektors mit einer 4×4 Matrix ist jedoch direkt nicht möglich, weshalb man den Vektor um eine Komponente erweitern und somit einen 4-dimensionalen Vektor erhält den man mit der Matrix problemlos multiplizieren kann. Diese vierte Koordinate nennt man w-Koordinate und hat vor der Transformation stets den Wert 1. Nach der Multiplikation muss man den erhaltenen 4D Vektor durch die w-Koordinate dividieren um falls sie nicht 1 ist wieder auf 1 zu bringen. Danach darf man die w-Koordinate wieder weglassen und hat somit den 3D Vektor korrekt transformiert.

<m>P = (x,y,z)</m>
<m>(x,y,z,1) * delim{[}{matrix{4}{4} { m_11 m_12 m_13 m_14

m_21 m_22 m_23 m_24
m_31 m_32 m_33 m_34
m_41 m_42 m_43 m_44 }}{]}

= (x^t,y^t,z^t,w^t)</m>
<m>P^t = (x^t/w^t,y^t/w^t,z^t/w^t)</m>

Projektionsmatrix

Aufgrund des Strahlensatz ergibt sich folgender Zusammenhang:

<m>P^l_x / near = P_x / {-P_z}</m>

Hinweis: P_z ist deshalb negativ, da die Kamera bei einem Linkshändigem Koordinatensystem in Richtung der negativen z-Achse schaut.

Auch wenn es in der Skizze verdeckt ist gilt analog das selbe auch in y-Richtung:

<m>P^l_y / near = P_y / {-P_z}</m>

Durch Umformen erhalten wir:

<m>P^l_x = P_x {near/{-P_z}}</m>
<m>P^l_y = P_y {near/{-P_z}}</m>

Hier fällt auf das in beiden Formeln durch <m>-P_z</m> dividiert wird. Da wir aber nur eine Matrizenmultiplikation durchführen ist eine Division direkt nicht möglich. Da wir aber mit homogenen Koordinaten arbeiten können wir einfach <m>-P_z</m> in die w Koordinate schreiben und erreichen somit die gewünschte Division. Wir können jetzt also die Division durch <m>-P_z</m> weglassen und müssen die erhaltenen Werte noch auf den Bereich [-1,1] normieren. Wenn wir die Größe des Ausschnitts auf dem Bildschirm durch width und height gegeben haben, dann müssen wir die x bzw. y Koordinate entsprechend durch die halbe Breite bzw. Höhe dividieren und erhalten daraus:

<m>P^l_x = P_x {near/{width/2}} = P_x 2_near_width_m_m_p_l_y_p_y_near_height_2 = P_y m_far_near_near_-_far * {-near} + d}/{near} = -1</m>
<m>far_near_near_-_far * {-near} + d = -near</m>
<m>d = -near + near * far_near_near_-_far</m>
<m>d = (far_near_near_-_far - 1) * near</m>
<m>d = far_near_-_near_-_far_near_-_far * near</m>
<m>d = 2_far_near_near_-_far</m>

Wir haben jetzt also alle nötigen Elemente der Matrix erhalten und können diese jetzt in eine Matrix eintragen:

<m>delim{[}{matrix{4}{4} { 2_near_width_0_0_0_0_2_near_height_0_0_0_0_far_near_near_-_far {-1}

0                0                 {{2 * far * near}/{near - far}} 0 }}{]}</m>