Übungen: Kameras & Projektion

Aufgaben zum Kamera-Modell der Computergrafik: NDC, extrinsische Parameter (View-Matrix via lookAt), intrinsische Parameter (orthografisch vs. perspektivisch), Strahlensatz (intercept theorem), View-Frustum und die komplette Transformationskette (transformation chain). Die Aufgaben sind nach Schwierigkeit gestaffelt. Rechne die Zahlenbeispiele selbst, bevor du die Lösung aufklappst. Passend zu Kapitel 7: Kameras.


Beginner

Aufgabe 1 (Beginner) - NDC-Wertebereich

Was ist der Normalized Device Space (NDC), und welchen Wertebereich hat er? Warum ist er für das Kamera-Modell zentral?

Lösung anzeigen

Der Normalized Device Space (normalized device space) ist der normierte Zielraum, in dem die GPU letztlich rendert. Er ist ein Würfel:

NDC=[1,1]3(von (1,1,1) bis (1,1,1))\text{NDC} = [-1, 1]^3 \quad\text{(von } (-1,-1,-1) \text{ bis } (1,1,1)\text{)}

Nur Vertices innerhalb dieses Würfels werden gerendert. Er ist zentral, weil die GPU nur diesen festen Bereich kennt. Die Aufgabe der Kamera-Transformationen besteht genau darin, eine frei platzierte Kamera und ihr Sichtvolumen so abzubilden, dass die sichtbare Geometrie in diesem [1,1]3[-1,1]^3-Würfel landet.

Tipp: Merke dir die Kette der Zielräume: Camera Space (Kameraraum) -> Projektion -> NDC-Würfel. Die Projektion "streckt" das Sichtvolumen auf den Würfel.

Siehe Kapitel 7: Kameras, Abschnitt "Normalized Device Space (NDC)".


Aufgabe 2 (Beginner) - Die 9 lookAt-Skalare

Die Funktion lookAt erzeugt die View-Matrix aus 9 Skalaren. Ordne die folgenden 9 Werte den drei extrinsischen Parametern zu und benenne jeden:

lookAt( cx, cy, cz,   // ?
        ax, ay, az,   // ?
        ux, uy, uz ); // ?
Lösung anzeigen

Die drei extrinsischen Kameraparameter (extrinsic camera parameters) sind jeweils ein 3D-Vektor, zusammen also 9 Skalare:

  • cx, cy, cz = Kamerazentrum c (camera center): die Position der Kamera.
  • ax, ay, az = Betrachtungspunkt a (look-at point / target): das Blickziel.
  • ux, uy, uz = up-Vektor u (up vector): legt die Oben-Richtung fest, also die Rotation um die Blickachse (Roll).

Diese drei Größen werden durch die View-Matrix V integriert.

Typischer Fehler: Den up-Vektor weglassen oder für beliebig halten. Ohne korrekten up-Vektor ist die Ausrichtung um die Blickachse unterbestimmt - die Kamera kann beliebig "verrollt" sein.

Siehe Kapitel 7: Kameras, Abschnitte "Äußere (extrinsische) Kameraparameter" und "lookAt".


Aufgabe 3 (Beginner) - Strahlensatz: einfache Projektion

Ein Punkt pp hat die Höhe py=6p_y = 6 und liegt in der Tiefe pz=3p_z = 3. Die Bildebene (image plane) liegt im Abstand n=1n = 1 vor der Kamera. Berechne die projizierte Höhe pyp'_y.

Lösung anzeigen

Grundlage ist der Strahlensatz (intercept theorem / similar triangles). Aus ähnlichen Dreiecken folgt:

pyn=pypzpy=npypz\frac{p'_y}{n} = \frac{p_y}{p_z} \quad\Longrightarrow\quad p'_y = \frac{n \, p_y}{p_z}

Einsetzen der Zahlen:

py=163=63=2p'_y = \frac{1 \cdot 6}{3} = \frac{6}{3} = 2

Die projizierte Höhe ist also py=2p'_y = 2.

Tipp: Die Division durch pzp_z ist der Kern der perspektivischen Verkleinerung: bei fester Höhe pyp_y wird die Projektion kleiner, je größer die Tiefe pzp_z wird. Für xx gilt analog px=npx/pzp'_x = n\,p_x / p_z.

Siehe Kapitel 7: Kameras, Abschnitt "Herleitung über den Strahlensatz".


Fortgeschritten

Aufgabe 4 (Fortgeschritten) - Orthografisch vs. perspektivisch

Vergleiche die orthografische (Parallel-) Projektion mit der perspektivischen Projektion. Gehe auf drei Aspekte ein: Verlauf der Projektionsstrahlen, Form des Rendervolumens und die Größenwahrnehmung mit der Entfernung.

Lösung anzeigen
AspektOrthografisch (parallel)Perspektivisch
Projektionsstrahlenverlaufen paralleltreffen sich in einem Fluchtpunkt (vanishing point)
RendervolumenQuader zwischen (l,b,n)(l,b,n) und (r,t,f)(r,t,f)Pyramidenstumpf / Frustum
Größe mit Entfernungkeine Verkleinerung, Größe bleibt konstantObjekte erscheinen kleiner, je weiter hinten sie liegen
  • Orthografisch: Es gibt keine perspektivische Verkleinerung. Definiert wird ein quaderförmiges Volumen, das in den NDC-Würfel transformiert wird (glOrtho). Nützlich z. B. für technische Ansichten oder 2D.
  • Perspektivisch: Die "natürliche Darstellung", basiert auf dem Lochkamera-Modell (pinhole camera) und dem Strahlensatz. Das Sichtvolumen ist ein Frustum (glm::frustum / glm::perspective).

Tipp: Merksatz Perspektive - "je weiter hinten, desto kleiner". Wird diese Regel gebrochen, entsteht eine fehlerhafte Größeninformation (optische Täuschung).

Siehe Kapitel 7: Kameras, Abschnitte "Orthografische (Parallel-) Projektion" und "Perspektivische Wahrnehmung".


Aufgabe 5 (Fortgeschritten) - Strahlensatz für x und y, plus Verkleinerung

Die Bildebene liegt im Abstand n=2n = 2. Ein Punkt hat px=8p_x = 8, py=5p_y = 5, pz=10p_z = 10.

a) Berechne pxp'_x und pyp'_y. b) Ein zweiter Punkt hat dieselbe Höhe py=5p_y = 5, liegt aber in doppelter Tiefe pz=20p_z = 20. Berechne dessen pyp'_y und interpretiere den Vergleich.

Lösung anzeigen

a) Mit px=npx/pzp'_x = n\,p_x / p_z und py=npy/pzp'_y = n\,p_y / p_z:

px=2810=1610=1,6p'_x = \frac{2 \cdot 8}{10} = \frac{16}{10} = 1{,}6 py=2510=1010=1p'_y = \frac{2 \cdot 5}{10} = \frac{10}{10} = 1

b) Gleiche Höhe py=5p_y = 5, aber pz=20p_z = 20:

py=2520=1020=0,5p'_y = \frac{2 \cdot 5}{20} = \frac{10}{20} = 0{,}5

Interpretation: Die Tiefe hat sich von 1010 auf 2020 verdoppelt, die projizierte Höhe hat sich von 11 auf 0,50{,}5 halbiert. Bei fester realer Höhe ist die projizierte Größe umgekehrt proportional zur Tiefe pzp_z - das ist die perspektivische Verkleinerung.

Typischer Fehler: Vergessen, dass nn nur ein gemeinsamer Skalierungsfaktor ist. Das Größenverhältnis zwischen zwei Punkten hängt allein vom Verhältnis ihrer pzp_z-Werte ab (hier Faktor 22 -> Faktor 12\tfrac{1}{2}).

Siehe Kapitel 7: Kameras, Abschnitt "Herleitung über den Strahlensatz".


Aufgabe 6 (Fortgeschritten) - glm::frustum vs. glm::perspective

Welche Aussage(n) zu den beiden Frustum-Definitionen sind korrekt? (Mehrfachauswahl möglich)

glm::frustum(float left, float right, float top, float bottom, float near, float far);
glm::perspective(float theta, float aspect, float near, float far);
  1. glm::perspective kann nur symmetrische Frusta erzeugen.
  2. glm::frustum kann auch asymmetrische Frusta erzeugen.
  3. Bei glm::perspective ist theta der vertikale Öffnungswinkel (field of view).
  4. glm::perspective benötigt keine near/far-Ebenen.
Lösung anzeigen

Korrekt: 1, 2 und 3. Aussage 4 ist falsch.

  • (1) richtig: glm::perspective erzeugt nur symmetrische Frusta. Für asymmetrische Frusta braucht man glm::frustum.
  • (2) richtig: glm::frustum erlaubt über left, right, top, bottom auch asymmetrische Frusta.
  • (3) richtig: theta ist der vertikale Öffnungswinkel (opening angle / field of view), aspect ist das Seitenverhältnis (aspect ratio).
  • (4) falsch: Beide Funktionen benötigen near und far. Erst die Clipping-Ebenen (near-plane, far-plane) machen die Projektion als Matrixmultiplikation möglich.

Typischer Fehler: Die Parameter-Reihenfolge von glm::frustum ist left, right, TOP, BOTTOM, near, far - top steht vor bottom, abweichend von glOrtho, das bottom vor top hat. Reihenfolge nicht durcheinanderbringen.

Siehe Kapitel 7: Kameras, Abschnitte "View-Frustum und Clipping-Ebenen" und "Frustum-Definition".


Anspruchsvoll

Aufgabe 7 (Anspruchsvoll) - Die Transformationskette und ihre Reihenfolge

Gegeben die kompakte Transformationskette

p=MprojVMModelp\mathbf{p}' = M_{proj} \cdot V \cdot M_{Model} \cdot \mathbf{p}

a) In welcher Reihenfolge wirken die Matrizen auf einen Vertex, und warum? b) Wie sieht die entsprechende Zeile im Vertex-Shader aus, und welcher Fallstrick lauert bei der Schreibreihenfolge?

Lösung anzeigen

a) Die Matrizen wirken von rechts nach links auf den Vertex p\mathbf{p}:

  1. Zuerst MModelM_{Model}: platziert den Vertex in der Welt (akkumulierte Translation, Skalierung, Rotation).
  2. Dann VV (View-Matrix): bringt die Welt in den Camera Space (Kameraraum), Kamera im Ursprung, Blick entlang Z-Z.
  3. Zuletzt MprojM_{proj}: bildet das Sichtvolumen auf den NDC-Würfel ab (MorthoM_{ortho} oder MpersM_{pers}).

Grund: Matrixmultiplikation ist assoziativ, aber die auf den Vektor zuletzt angewandte Matrix steht ganz links.

b) Im GLSL-Vertex-Shader:

gl_Position = projection * view * model * vec4(vertex, 1.0);

Fallstrick: projection steht links (wird zuerst geschrieben), wirkt aber zuletzt; model steht rechts, wirkt zuerst. Die Schreibreihenfolge ist die Umkehrung der Wirkungsreihenfolge.

Typischer Fehler: Reihenfolge vertauschen (z. B. model * view * projection). Matrixmultiplikation ist nicht kommutativ - eine falsche Reihenfolge liefert falsche Ergebnisse.

Tipp: Der Shader-Output ist die Position in homogenen Koordinaten (homogeneous coordinates), also vor der perspektivischen Division. Die Homogenisierung (Division durch ww) erfolgt erst nach dem Vertex-Shader.

Siehe Kapitel 7: Kameras, Abschnitte "Die komplette Transformationskette" und "Umsetzung im Vertex-Shader".


Aufgabe 8 (Anspruchsvoll) - Aufbau der View-Matrix und z-Negation

a) Aus welchen zwei Teil-Matrizen setzt sich die View-Matrix VV zusammen, und was stehen in den Zeilen der Rotationsmatrix? b) Warum ist zusätzlich eine Negation der z-Koordinate (MRLM_{R \to L}) nötig?

Lösung anzeigen

a) Die View-Matrix ist das Produkt aus Rotationsmatrix und Translationsmatrix:

V=RcamT(c)V = R_{cam} \cdot T(-c)
  • Die Rotationsmatrix enthält als Zeilen die drei Kamera-Achsen, jeweils ausgedrückt in Weltkoordinaten: x-Achse (rot), y-Achse (grün), z-Achse (blau/türkis).
  • Die Translationsmatrix verschiebt um c-c, also das negative Kamerazentrum, so dass die Kamera in den Ursprung wandert.

Zugrunde liegt ein rechtshändiges Koordinatensystem; das Ergebnis ist der View Space / Camera Space, in dem die Kamera im Ursprung liegt und entlang Z-Z blickt.

b) Der Camera Space ist rechtshändig (Kamera blickt entlang Z-Z), der NDC ist linkshändig (positive z-Werte als Entfernung). Um zwischen den Systemen zu wechseln, multipliziert MRLM_{R \to L} die z-Werte mit 1-1:

MRL=(1000010000100001)M_{R \to L} = \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & -1 & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix}

Diese Invertierung ist in den gl-Methoden bereits integriert.

Typischer Fehler: Annehmen, die Kamera blicke im View Space entlang +Z+Z. Sie blickt entlang Z-Z (rechtshändig); erst die z-Negation stellt die Konsistenz mit dem linkshändigen NDC her.

Siehe Kapitel 7: Kameras, Abschnitte "View Transformation und View-Matrix" sowie "Negation der z-Koordinate".


Klausur-Niveau

Aufgabe 9 (Klausur-Niveau) - Gemischte Multiple-Choice

Kreuze für jede Aussage an, ob sie wahr oder falsch ist:

  1. Der NDC ist der Würfel [1,1]3[-1,1]^3.
  2. Die extrinsischen Parameter legen fest, welcher Bereich der Szene gerendert wird.
  3. Bei der orthografischen Projektion gibt es keine perspektivische Verkleinerung.
  4. Im Vertex-Shader wird die perspektivische Division bereits durchgeführt.
  5. Der up-Vektor bestimmt die Rotation um die Blickachse.
Lösung anzeigen
  1. Wahr. NDC=[1,1]3\text{NDC} = [-1,1]^3.
  2. Falsch. Das ist die Aufgabe der intrinsischen Parameter (Projektion). Die extrinsischen Parameter beschreiben Position und Ausrichtung der Kamera (View-Matrix).
  3. Wahr. Orthografisch: parallele Strahlen, keine Verkleinerung mit der Entfernung.
  4. Falsch. Der Shader gibt die Position in homogenen Koordinaten vor der Division aus. Die perspektivische Division (Homogenisierung durch ww) erfolgt nach dem Vertex-Shader.
  5. Wahr. Der up-Vektor uu legt die Oben-Richtung und damit die Rotation um die Blickachse (Roll) fest.

Typischer Fehler: intrinsisch und extrinsisch vertauschen. Merkhilfe - extrinsisch = externe Lage (wo/wie steht die Kamera); intrinsisch = innere Optik (welcher Ausschnitt / Öffnungswinkel).

Siehe Kapitel 7: Kameras, Abschnitt "Prüfungsrelevanz".


Aufgabe 10 (Klausur-Niveau) - Kombinierte Aufgabe

Eine Szene wird perspektivisch dargestellt. Die Bildebene (near-plane) liegt im Abstand n=4n = 4.

a) Ein Objektpunkt hat py=12p_y = 12 in Tiefe pz=8p_z = 8. Berechne pyp'_y. b) Ein identischer Punkt derselben Höhe liegt in Tiefe pz=16p_z = 16. Berechne pyp'_y und erkläre den Größenunterschied. c) Nenne die vollständige (kompakte) Transformationskette, die diesen Punkt bis in den NDC bringt, und benenne die drei Raumstufen der Pipeline.

Lösung anzeigen

a) Strahlensatz py=npy/pzp'_y = n\,p_y / p_z:

py=4128=488=6p'_y = \frac{4 \cdot 12}{8} = \frac{48}{8} = 6

b) Bei doppelter Tiefe pz=16p_z = 16:

py=41216=4816=3p'_y = \frac{4 \cdot 12}{16} = \frac{48}{16} = 3

Die Tiefe hat sich verdoppelt, die projizierte Höhe halbiert sich von 66 auf 33. Das ist die perspektivische Verkleinerung: die Division durch pzp_z macht entferntere Objekte kleiner.

c) Kompakte Transformationskette:

p=MprojVMModelp(Mproj=Mortho oder Mpers)\mathbf{p}' = M_{proj} \cdot V \cdot M_{Model} \cdot \mathbf{p} \qquad (M_{proj} = M_{ortho}\ \text{oder}\ M_{pers})

Wirkung von rechts nach links: MModelM_{Model} platziert in der Welt, VV bringt in den Camera Space, MprojM_{proj} bildet auf den NDC ab. Die drei Raumstufen der Pipeline:

  1. Camera View - das finale gerenderte Bild.
  2. Camera Space (Kameraraum) - Objekte im Frustum.
  3. Normalized Device Space - Objekte im NDC-Würfel, durch die Projektion "gestreckt".

Hinweis: Die vollständige perspektivische Projektionsmatrix selbst ist laut Kapitel ausdrücklich nicht klausurrelevant. Für diese Aufgabe genügt der Strahlensatz py=npy/pzp'_y = n\,p_y/p_z (konzeptionell relevant) plus die Kenntnis von Kette und Raumstufen; die 4x4-Matrix muss nicht hergeleitet werden.

Tipp: Auch ohne die Matrix solltest du ihre Wirkung kennen: x,yx, y werden perspektivisch skaliert, zz wird nichtlinear skaliert (mehr Tiefenpräzision für nahe Objekte). Eine sehr ferne far-Ebene bei sehr naher near-Ebene führt zu Präzisionsverlust in der Ferne (z-fighting).

Siehe Kapitel 7: Kameras, Abschnitte "Herleitung über den Strahlensatz", "Die komplette Transformationskette" und "Perspektivische Division und Tiefenpräzision".