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 dasKoordinatensystems
$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}$
2. Skalierung der Box auf [-1,-1,-1][1,1,1]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' = -nDie 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:
$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?
Setzt man in obige Gleichung für f' = -f und n' = -n so erhält man eine wahre Aussage.
Gilt folgendes?:
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}$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:
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