prev up next


Aufgabe 8.1 (25 Punkte)

Auf diesem Aufgabenblatt sollen Sie sich mit den einzelnen Schritten der Viewing-Pipeline befassen.

Bevor Sie diese in Aufgabe 2 tatsächlich in Java umsetzen, beschäftigen Sie sich in dieser Aufgabe mit den mathematischen Grundlagen der einzelnen Transformationen. Berechnen Sie dazu die einzelnen Transformationsmatrizen und erklären Sie Ihrem Tutor den Ablauf und die Bedeutung der Schritte der Viewing-Pipeline.

Gehen Sie davon aus, dass der Augenpunkt (wie in der Aufgabe 2 als Ausgangspunkt gewählt) bei den Koordinaten $(4,10,10,1)$ liegt und der View-Reference-Point (also der Punkt, auf den geguckt wird) bei $(0,0,0,1)$. Der View-Up-Vektor sei $(4,11,10,1)$, das Blickfeld soll einen Winkel von $22,5^\circ$ umfassen. Gehen Sie außerdem davon aus, dass Ihr Ausgabe-Device eine Auflösung von 640x480 Pixeln, also ein Seitenverhältnis von 4:3 hat.

Stellen Sie zu jedem Schritt der Viewing-Pipeline die entsprechenden Matrizen für die obigen Werte auf und ergänzen Sie jeden Schritt um eine kurze schriftliche Erklärung. Sie können davon ausgehen, dass die Koordinaten der Objekte bereits in Welt-Koordinaten (WC-Koordinatensystem) vorliegen. Berechnen Sie schließlich Ihre Gesamtmatrix.

Die Transformation vom WC ins DC setzt sich aus drei Schritten zusammen:

  1. View Orientation (WC $\Rightarrow$ VRC),
  2. View Mapping (VRC $\Rightarrow$ NPC) und
  3. Device Mapping (NPC $\Rightarrow$ DC).
Jeder Schritt wird durch eine Matrix realisiert; sie werden mit den Koordinatensystemen bezeichnet zwischen denen sie vermitteln und errechnen sich folgendermaßen:

  1. WC_VRC.

    Für den Übergang vom WC ins VRC ist ein Basiswechsel nötig. Daher müssen zunächst die Vektoren $\vec{U},\vec{V}$ und $\vec{N}$ bestimmt werden, die die Basis des VRC bilden und der entsprechende Ursprung muss ermittelt werden.
    $\vec{N}$ ergibt sich aus der Blickrichtung und ist die Differenz zwischen VRP und PRP:

    \begin{displaymath}PRP - VRP = \vec{N} =
\left [\begin{array}{c}4\\ 10\\ 10\end{array} \right ]\end{displaymath}

    $\vec{V}$ ist der in die Bildebene projizierte VUV. Um die Projektion in die Bildebene zu bewerkstelligen, wird zunächst das Kreuzprodukt von $\vec{N}$ mit $\vec{VUV}$ gewählt, was einen Vektor senkrecht zu beiden ergibt. Das Ergebnis gekreuzt mit dem $\vec{N}$ ergibt also einen Vektor, der senkrecht auf $\vec{N}$ steht und für den oben die gleiche Richtung wie für den $\vec{VUV}$ darstellt. Es handelt sich also um die gesuchte Projektion.

    \begin{displaymath}(\vec{N} \times \vec{VUV}) \times \vec{N} = \vec{V} =
\left [\begin{array}{c}-40\\ 116\\ -100\end{array} \right ]\end{displaymath}

    Der Vektor $\vec{U}$ ist der zu $\vec{N}$ und $\vec{V}$ senkrechte und wird mittels des Kreuzproduktes der beiden Vektoren ermittelt.

    \begin{displaymath}\vec{V} \times \vec{N} = \vec{U} =
\left [\begin{array}{c}2160\\ 0\\ -864\end{array} \right ]\end{displaymath}

    Nun kann die Matrix mit den normierten Vektoren aufgestellt werden, die einen Basiswechsel vom VRC in den WC durchführt. Die Vektoren müssen normiert werden, damit die Längen aus dem (normierten) Weltkoordinatensystem erhalten bleiben:

    \begin{displaymath}VRC\_WC =
\left [ \begin{array}{rrrr}
0.928 & -0.253 & 0.272...
... & 0.680 & 0.0\\
0.0 & 0.0 & 0.0 & 1\\
\end{array} \right ]\end{displaymath}

    Um vom WC ins VRC zu gelangen muss die Matrix invertiert werden, also

    \begin{displaymath}WC\_VRC = VRC\_WC^{-1} =
\left [
\begin{array}{rrrr}
0.928 &...
... 0.680 & 0.0 \\
0.0 & 0.0 & 0.0 & 1.0 \\
\end{array}\right ]\end{displaymath}

  2. VRC_NPC. Der mittlere Teil dieses Schrittes ist im Skript im Abschnitt 15.2.4 als Matrix angegeben. Diese Matrix sei mit VRC'_NPC' bezeichnet. Sorgt für die Transformation des Pyramiedenstumpfes in den Einheitswürfel. Für den Gesamtschritt vom VRC ins NPC muß zunächst der Augenpunkt in den Koordinatenursprung verschoben werden. Wichtig ist dabei, zu beachten, dass der Augenpunkt bezüglich des VRC gemeint ist. Der ursprüngliche Augenpunkt muss also zunächst mit der eben berechneten Matrix multipliziert werden.


    \begin{displaymath}T =
\left [ \begin{array}{rrrr}
1 & 0 & 0 & 0.0\\
0 & 1 &...
...
0 & 0 & 1 & -14.697\\
0 & 0 & 0 & 1\\
\end{array} \right ]\end{displaymath}

    Anschließend wird an der $xy$-Ebene gespiegelt.


    \begin{displaymath}Sp_{xy} =
\left [ \begin{array}{rrrr}
1 & 0 & 0 & 0\\
0 &...
... 0\\
0 & 0 & -1 & 0\\
0 & 0 & 0 & 1\\
\end{array} \right ]\end{displaymath}

    Jetzt blickt das Auge in Richtung der $\vec{N}$ bzw. der neuen z-Achse. Nun kann die Matrix VRC'_NPC' angewendet werden. Dazu müssen jedoch zunächst die Ausmaße der View-Plane, also des Sichtfensters berechnet werden. Der Abstand $d$ zur Viewplane ergibt sich aus dem Abstand des $\vec{PRP}$ zum $\vec{VRP}$.

    $d = \vert\vec{PRP} - \vec{VRP}\vert = 14.697$

    $xmax$ ergibt sich aus dem angegebenen Field of View, also aus der Größe des Blickfelds. Es gilt:

    $xmax = tan(\frac{22.5^\circ}{2}) \cdot d = 2.923$

    Da das Blickfeld symmetrisch sein und das Seitenverhältnis des Ausgabegerätes beachten werden soll, gilt auch:

    $xmin = -xmax = -2.923$ und $ymax = \frac{480}{640} * xmax = 2.193$ und $ymin = -ymax = -2.193$.

    Diese Werte können in die unten angegebene Matrix eingesetzt werden. $dmin$ und $dmax$ geben die Entfernung zur Near- bzw. Farplane an. Hier können Beispielsweise die Werte $0.1$ für die $dmin$ und $100$ für $dmax$ angenommen werden.


    \begin{displaymath}VRC'\_NPC' =
\left [ \begin{array}{cccc}
\frac{d}{x_{max}- x...
...n}}{d_{max}- d_{min}}\\
0 & 0 & 1 & 0\\
\end{array} \right ]\end{displaymath}

    Da der nun erzeugte Einheitswürfel seine Vorderseite noch in der $xy$-Ebene hat und so Elemente die weiter vorne liegen kleinere $z$-Werte haben, muss der Würfel noch einmal verschoben und gespiegelt werden:


    \begin{displaymath}T(0,0,-1,1) =
\left [ \begin{array}{rrrr}
1 & 0 & 0 & 0\\
...
... 0\\
0 & 0 & 1 & -1\\
0 & 0 & 0 & 1\\
\end{array} \right ]\end{displaymath}


    \begin{displaymath}Sp_{xy} =
\left [ \begin{array}{rrrr}
1 & 0 & 0 & 0\\
0 &...
... 0\\
0 & 0 & -1 & 0\\
0 & 0 & 0 & 1\\
\end{array} \right ]\end{displaymath}

    Unter obigen Annahmen ergibt sich die Gesamtmatrix:


    \begin{displaymath}VRC\_NPC =
\left [ \begin{array}{rrrr}
2.514 & 0.0 & -0.5 &...
...1 & 0.085\\
0.0 & 0.0 & -1.0 & 14.697\\
\end{array} \right ]\end{displaymath}

  3. NPC_DC. Jetzt muss der Würfel noch auf die Größe des Devices gestreckt werden. Die Matrix für diesen Schritt ist im Skript gegeben:


    \begin{displaymath}NPC\_DC =
\left [ \begin{array}{cccc}
640 & 0 & 0 & 0\\
0 ...
...480\\
0 & 0 & 1 & 0\\
0 & 0 & 0 & 1\\
\end{array} \right ]\end{displaymath}

Die Gesamttransformationsmatrix für die Viewing-Pipeline lautet für die obigen Bedingungen:


\begin{displaymath}WC\_DC =
\left [ \begin{array}{cccc}
1406.593 & -217.732 & -...
...5\\
-0.272 & -0.680 & -0.680 & 14.697\\
\end{array} \right ]\end{displaymath}


prev up next