Look-At
Gegeben eine beliebige Kamera mit Parametern $Center, Direction, Up$.
- Berechne einen $Right$-Vektor: $Right = Direction \times Up$
- Korrigiere den $Up$-Vektor (er muss anfangs nicht senkrecht auf $Direction$ stehen): $Up = Right \times Direction$
- Die Basiswechselmatrix vom Standardkoordinatensystem in das Koordinatensystem der Kamera lautet:
- Die Look-At-Transformation ist dann das Inverse dieser Transformation:
GRR: Nummerierung spinnt. Und die Indizes sind glaubich falschrum.
Frustum Transformation
Herleitung aus http://www.cs.kuleuven.ac.be/cwis/research/graphics/INFOTEC/viewing-in-3d/node8.html
Die Frustummatrix kann man entweder bestimmen, indem man genügend Vektoren abbildet und ein lineares Gleichungssystem löst, bei dem dann die Einträge der Matrix alle auf einmal rauskommen. Man kann aber auch zuerst das Frustum so transformieren, dass das lineare Gleichungssystem simpler wird.
Gegeben: Ein beliebiges Frustum mit Parametern near $z=-n$, far $z=-f$, left $l$, right $r$, top $t$, bottom $b$
Gesucht: $M_{frustum} = M_{project} M_{scale} M_{shear}$
Scherung
Zuerst wird das Frustum entlang der $x$-$y$-Ebene geschert, so dass es symmetrisch zur $z$-Achse ist:
(3)Skalierung
Dann wird es entlang der $x$-$y$-Ebene skaliert, so dass es bei einer Projektion auf $z=-1$ auf $[-1,1]^2$ projiziert (Teilen durch die Breite/Höhe, Multiplizieren mit -2n)
(4)Projektion
Danach ist die Abbildung des Frustums in den Einheitswürfel nur noch eine Standardprojektion, die nur noch von der $z$-Koordinate abhängt:
(5)Die Einträge $a$ und $b$ ergeben sich aus einem simplen LGS, wobei die Abbildungen der Punkte $(0,0,n,1)^T$ und $(0,0,f,1)^T$ betrachtet werden:
(6)Viewport Transformation
Als letztes muss man den Einheitswürfel $[-1,1]^3$ dann auf die gegebenen Viewport-Koordinaten $[l,l+w]\times[b,b+h]$ abbilden (indem man den Würfel transliert, skaliert und die $z$-Koordinate wegfallen lässt):
(7)previous | next |