Herleitung Orthogonale Projektionmatrix von OpenGL?



  • Gegeben: Orthogonales Frustum beschrieben durch r, l, t, b, n, f (kann als AABB betrachtet werden)

    die gegebenen Koordinaten (r,l,t,b,n,f) beziehen sich auf folgendes Koordinatensystem:

    z-
    /\
    |
    |
    +-----> x
    |
    |
    |
    \/
    z+
    

    Die y-Achse steht senkrecht auf der z- und x-Achse. Der Betrachter soll entlang der negativen z Achse sehen.

    Das heißt n > f, aber |n|<|f|

    Gesucht Transformation zum kanonischen Einheitswürfel [-1,-1,-1][1,1,1]

    Idee:
    1. Mittelpunkt des Orthogonalen Frustums berechnen und verschieben des Mittelpunkts in das Zentrum das

    Koordinatensystems
    2. Skalierung der Box auf [-1,-1,-1][1,1,1]

    $T = \begin{pmatrix} 1 & 0 & 0 & -\frac{r+l}{r-l}\\ 0 & 1 & 0 & -\frac{t+b}{t-b} \\ 0 & 0& 1& -\frac{f+n}{f- n}\\ 0 & 0 & 0 & 1 \end{pmatrix}$

    Jetzt noch skalieren:

    $S = \begin{pmatrix} \frac{2}{r-l} & 0 & 0 & 0\\ 0 & \frac{2}{t-b} & 0 & 0 \\ 0 & 0& \frac{2}{f-n}& 0\\ 0 & 0 & 0 & 1 \end{pmatrix}$

    Die Projektionsmatrix ergibt sich wie folgt:

    $P = S * T = \begin{pmatrix} \frac{2}{r-l} & 0 & 0 & -\frac{r+l}{r-l}\\ 0 & \frac{2}{t-b} & 0 & -\frac{t+b} {t-b} \\ 0 & 0& \frac{2}{f-n}& -\frac{f+n}{f-n}\\ 0 & 0 & 0 & 1 \end{pmatrix}$

    Dumm an der Matrix ist, dass jetzt die Near Clipping Plane auf 1 und die Far Clipping Plane auf -1 abgebildet

    wird. Wie kann ich das Ändern, so dass die Near Clipping Plane auf -1 und die Far Clipping Plane auf +1

    abgebildet wird und meine resultierende Matrix genau so aussieht wie die Matrix die glOrtho (nach OpenGL 1.3

    Specification: http://www.opengl.org/documentation/specs/) liefert.

    Die OpenGL 1.3 Ortho Matrix sieht so aus:

    $\begin{pmatrix} \frac{2}{r-l} & 0 & 0 & -\frac{r+l}{r-l}\\ 0 & \frac{2}{t-b} & 0 & -\frac{t+b}{t-b} \\ 0 & 0& -\frac{2}{f'-n'}& -\frac{f'+n'}{f'-n'}\\ 0 & 0 & 0 & 1 \end{pmatrix}$

    f' = -f
    n' = -n

    Die Idee war ich spiegle einfach alle Werte an der x,y Ebene, nachdem die Szene in das Kanonische

    Einheitsvolumen transformiert wurde:

    Matrix, die Spiegelung an der x,y Ebene durchführt:

    M=(1000010000100001)M = \begin{pmatrix} 1 & 0 & 0 & 0\\ 0 & 1 & 0 & 0 \\ 0 & 0& -1& 0\\ 0 & 0 & 0 & 1 \end{pmatrix}

    $G = M * P = M\*S \* T = \begin{pmatrix} \frac{2}{r-l} & 0 & 0 & -\frac{r+l}{r-l}\\ 0 & \frac{2}{t-b} & 0 & - \frac{t+b}{t-b} \\ 0 & 0& -\frac{2}{f-n}& \frac{f+n}{f-n}\\ 0 & 0 & 0 & 1 \end{pmatrix}$

    Irgendwie sieht das aber nicht wie die OpenGL Matrix aus. Oder etwa doch?

    Gilt folgendes?

    2fn=2fn-\frac{2}{f-n}=-\frac{2}{f'-n'}

    Setzt man in obige Gleichung für f' = -f und n' = -n so erhält man eine wahre Aussage.

    Gilt folgendes?:

    f+nfn=f+nfn\frac{f+n}{f-n} = -\frac{f'+n'}{f'-n'}

    GILT NICHT! (f'=-f und n'=n liefert keine wahre Aussage) - das wundert mich

    Funktioniert es, wenn man als erstes die Spiegelung und anschließend die Projektion durchführt?

    $G' = P\*M = S \* T * M = \begin{pmatrix} \frac{2}{r-l} & 0 & 0 & -\frac{r+l}{r-l}\\ 0 & \frac{2}{t-b} & 0 & - \frac{t+b}{t-b} \\ 0 & 0& -\frac{2}{f-n}& -\frac{f+n}{f-n}\\ 0 & 0 & 0 & 1 \end{pmatrix}$

    f+nfn=f+nfn-\frac{f+n}{f-n} = -\frac{f'+n'}{f'-n'}

    liefert eine wahre Aussage

    Das heißt OpenGL führt VOR der Orthogonalen Projektion eine Spiegelung durch. Die Spiegelung wandelt das rechtshändige Koordinatensystem von OpenGL dabei in ein Linkshändiges Koordinatensystem um - ist das korrekt so? (natürlich ist diese Spiegelung in die Projektion "eingebaut" und wird deshalb nie explizit erwähnt)

    [edit: Latex-Code gefixt, tausend Änderungen vorgenommen)



  • Hm, ich hab noch nie OGL benutzt und den Text von dir jetzt nur überflogen, weil er dank nicht-korrekt dargestelltem Latexcode ja doch ziemlich unleserlich ist. Aber sollte die OGL orthografische Projektionsmatrix nicht einfach nur T*S*M sein, wobei T eine Translationsmatrix ist, die um -Viewfrustummittelpunkt verschiebt, S eine Skalierungsmatrix um die Box auf Kantenlänge 2 zu bringen und M ein Spiegelmatrix um das Vorzeichen von z umzudrehen.



  • T*S*M oder column major M*S*T dachte ich auch - aber bei obiger Herleitung stimmt dann das Matrix-Element in Zeile 3 Spalte 4 nicht:

    f+nfn=f+nfn\frac{f+n}{f-n}=-\frac{f'+n'}{f'-n'}

    liefert eine falsche Aussage, also kann es nicht M*S*T sein - aber was dann?

    ganz einfach: column major: S*T*M
    row major: M*T*S



  • glOrtho erwartet f‘=-f und f‘=-n. Soll die Far Clipping Plane vor dem Betrachter liegen, so muss f‘ positiv sein, sonst negativ. Für die Near Clipping Plane gilt das selbe.

    Normalerweise ist f‘ > n‘ oder n > f – was passiert wenn n < f bzw. f‘<n‘?
    Andere Formulierung: Was passiert, wenn man Near und Far vertauscht (vorausgesetzt vorher f‘>n‘)?

    Ohne Überprüfung: Alles wie bie f‘>n‘ nur z-Werte werden gespiegelt – aus -1 wird 1 usw. (d. h. was erst nah am Betrachter dran war ist jetzt weit Weg)

    ist meine Vermutung richtig so?



  • Also liefert M*T*S (row Major) die OGL ortho. Proj.-Matrix? Das wäre ja dann im Grunde das selbe zu meinem getippten T*S*M, da es egal ist, ob ich am Anfang oder Ende spiegle. Entscheidend ist nur, dass T vor S steht. Und natürlich, dass die Matrizen richtig sind. 😃



  • @this->that

    sorry ich habe den Beitrag nochmal überabeitet

    wie es sich herausstellt spielt es schon einer Rolle wann man Spiegelt: G != G'



  • Vertexwahn schrieb:

    wie es sich herausstellt spielt es schon einer Rolle wann man Spiegelt: G != G'

    Kann ich mir nicht vorstellen. Kannst du dich nicht irgendwo verrechnet haben?
    Sollte z.B. in Matrix T bei t_11 und t_33 nicht eine 1 stehen?



  • ups T war falsch - war ein Versehen habs oben korregiert - hab aber die Rechnungen mit der "richtigen" T Matrix gemacht

    Ich und verrechnen? - nein das ist absolut ausgeschlossen 😃

    Ich bin mir relativ sicher, dass jetzt alles richtig gerechnet ist


Anmelden zum Antworten