Lösungsvorschlag zum zweiten Übungsblatt Aufgabe Wir zeigen, daß die Drehung um den Ursprung um 9 und die Spiegelung an der x-achse nicht kommutieren. Die Matrix für die Drehmatrix lautet in diesem Fall ( ) und die Matrix für die Spiegelung hat die Form ( ) Durch Rechnung ergibt sich einmal ( ) ( ) ( = ) und in der anderen Reihenfolge ( ) ( ) ( = ), wir erhalten also in Abhängigkeit von der Multiplikationsreihenfolge zwei verschiedene Ergebnisse. Aufgabe Teil : Eine Schermatrix hat im allgemeinen die Form σ τ In unserem Fall soll der Punkt (7,8) auf den Punkt (4,8) abgebildet werden, wir erhalten also folgende Gleichung: σ 7 4 τ 8 = 8 Daraus leiten wir das Gleichungssystem 7 + 8σ = 4
7τ + 8 = 8 ab, das die einzige Lösung σ = 3 8, τ = besitzt. Die Schermatrix ist also 3 8 Mit Hilfe dieser Matrix können wir den Bildpunkt des linken Fußpunktes (5,) berechnen, indem wir diesen Punkt in homogenen Koordinaten als (5,, ) schreiben und von links mit der Schermatrix multiplizieren: 3 8 5 = 5 Wir sind also mir unseren Überlegungen nicht völlig auf den Holzweg geraten, da diese homogenen Koordinaten dem Punkt (5,) entsprechen, wie es ja auch verlangt war. Als weitere Probe berechnen wir das Bild des Punktes (7,8), in homogenen Koordinaten (6, 4, ): 3 8 7 8 = 4 8 Auch hier wird das Verlangte geliefert; unsere Matrix scheint also richtig zu sein. Fü die weiteren Punkte erhalten wir: (5,) (5,) (7,) (7,) (7,8) (4,8) (,6) (7 3 4,6) (7,) (3 4,) (,8) (9,8) (6,4) ( 3 4,4) (,8) ( 3,8) (5,) ( 4,) (,6) ( 4,6) (5,8) (,8) Der Baum ist dann folgendermaßen zerzaust:
y x Teil Um die Spiegelung an der beschriebenen Geraden zu bestimmen verschieben wir die Palme zunächst so parallel zur y-achse nach unten, daß ihr Gipfel auf der x-achse zu liegen kommt. Danach spiegeln wir die Palme an der x-achse und verschieben sie dann anschließend wieder um den gleichen Betrag nach oben. Die Matrix für das Verschieben nach unten lautet 4, die Spiegelmatrix ist und das abschließende Zurückschieben bewerkstelligt die Matrix 4 Für die gesamte Transformation erhalten wir also die Matrix 4 4 = 8 Für die Bildpunkte erhalten wir dann: (5,) (5,8) (7,) (7,8) (7,8) (7,) (,6) (,) (7,) (7,8) 3
(,8) (,) (6,4) (6,4) (,8) (,) (5,) (5,8) (,6) (,) (5,8) (5,) Im Kopfstand bietet der Baum folgenden Anblick: y x Teil 3: Auch diese Aufgabe lösen wir mir der Hintereinanderausführung von Transformationen: Zuerst verschieben wir den rechten Fußpunkt des Baumes mittels der Matrix 7 in den Ursprung, lassen ihn dort durch die Matrix cos( 3 ) sin( 3 ) sin( 3 ) cos( 3 3 ) = 3 4
um 3 nach rechts rotieren und verschieben ihn durch Anwenden der Matrix 7 wieder zurück. Die Gesamttransformation ist dann durch 7 3 7 3 = gegeben. Anwenden dieser Matrix liefert folgende Bildpunkte: (5,) (5.7,) (7,) (7,) (7,8) (,6.93) (,6) (.6,3.7) (7,) (,8.66) (,8) (5.33,4.43) (6,4) (3.3,.6) (,8) (4.94,.43) (5,) (.7,9.66) (,6) (5.7,7.7) (5,8) (9.7,7.93) 3 7 3 + 7 3 7 Der Baum haucht seine Seele also in folgender Position aus: y x Aufgabe 3 Der Rand und die Spielfigur waren einfach zu zeichnen, wir konzentrieren uns auf die Kameraführung und den view-up-vektor. 5
Für die Kamera halten wir einfach ihre Position in Polarkoordinaten in den Variablen theta und phi gespeichert. Sie können einfach durch die Left-, Right-, Up- und Downtasten verändert werden und werden dann in kartesische Koordinaten umgerechnet, die anschließend im glulookat-aufruf benutzt werden. Diffiziler ist die Berechnung des view-up-vektors. Hierzu führen wir immer den Endpunkt des view-up-vektors als Summe der Kameraposition und des eigentlichen view-up-vektors in den view up end-variablen mit. Anschaulich entspricht das etwa der Kimme eines Gewehres, wenn wir die Kamera mit dem Benutzer des Gewehres identifizieren. Diesen Endpunkt lassen wir jede Bewegung der Kamera mitmachen. Dazu überlegen wir uns, daß eine Änderung des phi-winkels einer Rotation um die z-achse um den gleichen Betrag entspricht, das heißt, für jede Änderung von phi um DELTA lassen wir den view-up-endpunkt um DELTA um die z-achse rotieren. Eine Änderung von theta entspricht einer Rotation um eine Achse, die in der x-y-ebene liegt und senkrecht zur aktuellen Blickrichtung verläuft. Falls (x, y, ) die aktuelle Projektion der Blickrichtung auf die x-y-ebene ist, so erhalten wir die Richtung der Drehachse einfach durch (y, x, ): Dieser Vektor liegt offensichtlich in der x-y-ebene und mit Hilfe des Skalarproduktes zeigt man einfach, daß er senkrecht auf (x,y,) steht. Für x und y ergeben sich einfach die aktuellen x- bzw. y-koordinate der Kamera. Damit ist die Kameraführung und das Mitschleifen des view-up-vektors erledigt; eine Änderung des view-up-vektors geschieht nun einfach durch eine Rotation des view-up-endpunktes um eine Achse in Blickrichtung. Bei all diesen Operationen sind Rundungsfehler unvermeidlich; um zu verhindern, daß der view-up-vektor zu stark von der Senkrechten abweicht, führen wir noch eine Funktion update view up ein, die den view-up-vektor gegebenenfalls (in unserem Fall immer nach Änderungen) wieder geradebiegt. Dazu erstellen wir einen Vektor, der senkrecht auf der Blickrichtung b steht und in der gleichen Ebene wie die Blickrichtung b und der view-up-vektor v steht. Diese Eigenschaften erfüllt der Vektor v n v n, b n b n, wobei v n und b n die auf Länge Eins normierten Vektoren b und v bezeichnen. Da dieser Vektor eine Linearkombination von v und b ist, liegt er in der gleichen Ebene wie b und v, und daß er senkrecht auf b steht, zeigt man mittels des Skalarproduktes. 6