Camera Model

Look-At

Gegeben eine beliebige Kamera mit Parametern $Center, Direction, Up$.

  1. Berechne einen $Right$-Vektor: $Right = Direction \times Up$
  2. Korrigiere den $Up$-Vektor (er muss anfangs nicht senkrecht auf $Direction$ stehen): $Up = Right \times Direction$
  3. Die Basiswechselmatrix vom Standardkoordinatensystem in das Koordinatensystem der Kamera lautet:
(1)
\begin{align} _EM_C = \left[ \begin{array}{cccc} r_x & u_x & -d_x & c_x \\ r_y & u_y & -d_y & c_y \\ r_z & u_z & -d_z & c_z \\ 0 & 0 & 0 & 1 \\ \end{array} \right] \end{align}
  1. Die Look-At-Transformation ist dann das Inverse dieser Transformation:
(2)
\begin{align} M_{LookAt} = \left( _EM_C \right) ^{-1} = _CM_E \end{align}

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)
\begin{align} M_{shear} = \left( \begin{array}{cccc} 1 & 0 & -{r+l \over 2n} & 0 \\ 0 & 1 & -{t+b \over 2n} & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ \end{array} \right) \end{align}

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)
\begin{align} M_{scale} = \left( \begin{array}{cccc} {-2n\over r-l} & 0 & 0 & 0 \\ 0 & {-2n\over t-b} & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ \end{array} \right) \end{align}

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)
\begin{align} M_{project} = \left( \begin{array}{cccc} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & a & b \\ 0 & 0 & -1 & 0 \\ \end{array} \right) \end{align}

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)
\begin{align} \left\{ \begin{array}{l} (0,0,n,1)^T \rightsquigarrow (0,0,-1,1)^T \\ (0,0,f,1)^T \rightsquigarrow (0,0,1,1)^T \\ \end{array} \right\} \Rightarrow \left\{ \begin{array}{l} {an+b\over -n} = -1 \\ {af+b\over -f} = 1 \\ \end{array} \right\} \Rightarrow \left\{ \begin{array}{l} a={-(f+n) \over f-n}\\ b={2fn\over f-n}\\ \end{array} \right\} \end{align}

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)
\begin{align} M_{viewport} = \left( \begin{array}{cccc} {w\over 2} & 0 & 0 & l+{w\over 2} \\ 0 & {h\over 2} & 0 & b+{h\over 2} \\ 0 & 0 & 0 & 1 \\ \end{array} \right) \end{align}
previous next
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-Share Alike 2.5 License.