Computer Graphik (CS231) Projektübungsblatt 3

Ähnliche Dokumente
Computer Graphik (CS231) - Installation der Software

Computer Graphik. Mitschrift von

Transformationen im 3D-Raum

Erinnerung. Arbeitsschritte der Computergraphik. Modellierung. Animation. Rendering. Ausgabemedium. Generierung

VHDL - Grundlagen des Pointrenderings

Softwareprojekt Spieleentwicklung

Workshop: Einführung in die 3D-Computergrafik. Julia Tolksdorf Thies Pfeiffer Christian Fröhlich Nikita Mattar

Praktikum: Spieleengine im Eigenbau

3D-Transformationen. Kapitel Translation Skalierung

Koordinatensysteme und Clipping

Kapitel 2: Mathematische Grundlagen

y x x y ( 2x 3y + z x + z

Brückenkurs Mathematik. Mittwoch Freitag

Matrizen. Jörn Loviscach. Versionsstand: 12. April 2010, 19:00 Die nummerierten Felder sind absichtlich leer, zum Ausfüllen in der Vorlesung.

Einleitung 2. 1 Koordinatensysteme 2. 2 Lineare Abbildungen 4. 3 Literaturverzeichnis 7

Definition, Abbildungsmatrix, Spiegelung, Projektion

2D-Transformationen. Kapitel Translation. 6.2 Skalierung

Kapitel 3: Geometrische Transformationen

3D-Transformationen. Kapitel Translation Skalierung

Übungen Mathematik I, M

Seminar 3-D Grafik Mathematische Grundlagen, Räume, Koordinatensysteme, Projektionen. Hermann Schwarz Marko Pilop

WiMa-Praktikum 1. Woche 8

Lineare Abbildungen (Teschl/Teschl 10.3, 11.2)

EVC Repetitorium Blender

VU Einführung in Visual Computing 1. Test Gruppe A

Übungspaket 23 Mehrdimensionale Arrays

Kapitel 3. Transformationen

Probelektion zum Thema. Shadow Rendering. Shadow Maps Shadow Filtering

Wertebereich und Genauigkeit der Zahlendarstellung

1 Fraktale Eigenschaften der Koch-Kurve

++ + = 0 so erhält man eine quadratische Gleichung mit zwei Variablen dx+ey+f = 0 1.1

Planare Projektionen und Betrachtungstransformation. Quelle: Angel (2000)

Computergraphik Grundlagen

Brückenkurs Mathematik

Matrizen. Spezialfälle. Eine m nmatrix ist ein rechteckiges Zahlenschema mit. m Zeilen und n Spalten der Form. A = (a ij ) =

R-Wörterbuch Ein Anfang... ein Klick auf einen Begriff führt, sofern vorhanden, zu dessen Erklärung.

Komplexe Zahlen. (a, b) + (c, d) := (a + c, b + d) (a, b) (c, d) := (a c b d, a d + b c)

Programmieren mit DirectX

Lineare Algebra. Mathematik II für Chemiker. Daniel Gerth

Computer-Graphik I Transformationen & Viewing

OpenGL. (Open Graphic Library)

1 Matrizenrechnung zweiter Teil

Computer Vision I. Nikos Canterakis. Lehrstuhl für Mustererkennung, Universität Freiburg

Kapitel 4: Schattenberechnung

(12) Wiederholung. Vorlesung Computergrafik T. Grosch

2.2 Projektionen und Kameramodelle

geschlossene Schachtel mit einem kleinen Loch

Entwicklung einer Programmbibliothek zur Simulation von Hautdeformation durch Knochen und Muskeln

4. Kapitel 3D Engine Geometry

Theoretische Physik 1, Mechanik

Klausur Grundlagen der Programmierung

Körper sind nullteilerfrei

Bildtransformationen. Geometrische Transformationen Grauwert-Interpolation

13. Klasse TOP 10 Grundwissen 13 Geradengleichungen 01

Objektorientierte Programmierung

3.3. Drehungen und Spiegelungen

Mathematischer Vorkurs für Physiker WS 2012/13: Vorlesung 1

OOP und Angewandte Mathematik. Eine Einführung in die Anwendung objektorientierter Konzepte in der angewandten Mathematik

Praktikum 3: Klassen im Zusammenspiel

Darstellung runder Objekte in OpenGL ES. 1 Darstellung eines Zylinders oder Kegels. Inhaltsverzeichnis. Berechnen der Punkte.

Symplektische Geometrie

Addition, Subtraktion und Multiplikation von komplexen Zahlen z 1 = (a 1, b 1 ) und z 2 = (a 2, b 2 ):

Lineare Algebra: Determinanten und Eigenwerte

Übungskomplex Reelle Zahlen. Rechnen mit Gleitkommazahlen

Tutorium Mathematik II, M Lösungen

Gruppentheorie und Symmetrie in der Chemie

Vorkurs Mathematik Übungen zu Komplexen Zahlen

7. Wie lautet die Inverse der Verkettung zweier linearer Abbildungen? 9. Wie kann die Matrixdarstellung einer linearen Abbildung aufgestellt werden?

Übungspaket 23 Mehrdimensionale Arrays

Gleichungen dritten und vierten Grades und Konstruktionen mit mehr als Zirkel und Lineal

Matrizen und Drehungen

Lineare Algebra und analytische Geometrie I (Unterrichtsfach) Lösungsvorschlag

Freie Rotation im Raum

4 Lineare Abbildungen und Matrizen

Rang einer Matrix. 1-E1 Ma 1 Lubov Vassilevskaya

MC-Serie 11: Eigenwerte

Komplexe Zahlen (Seite 1)

Numerisches Programmieren

Computergrafik 1. 2D Rendering

Übungen zur Ingenieur-Mathematik III WS 2009/10 Blatt

Einführung in die Java- Programmierung

Java 3D. Linien, Flächen und Objekte Axel Bartsch, Okt. 2002

Lineare Abbildungen (Teschl/Teschl 10.3, 11.2)

2. Aufgabe Vereinfachen Sie die folgenden Ausdrücke so, dass möglichst wenige Multiplikationen ausgeführt werden müssen!

"rendern" = ein abstraktes geometrisches Modell sichtbar machen

Institut für Informatik und Angewandte Kognitionswissenschaften

Praktikum 3: Klassen im Zusammenspiel

Unterprogramme, Pointer und die Übergabe von Arrays

1. Definition der komplexen Zahlen Ziel: neuerliche Zahlbereichserweiterung, so dass auch Quadratwurzeln aus negativen Zahlen

44 Orthogonale Matrizen

Mathematik II Frühlingsemester 2015 Kapitel 8: Lineare Algebra 8.5 Eigenwerte und Eigenvektoren

JAVA für Nichtinformatiker - Probeklausur -

Transkript:

UNIVERSITÄT BASEL Prof. Dr. Thomas Vetter Departement Mathematik und Informatik Bernoullistrasse 16 CH 456 Basel Clemens Blumer Tobias Maier Fabian Brix http://informatik.unibas.ch/lehre/fs13/cs231/ Computer Graphik (CS231) 213 - Projektübungsblatt 3 Ausgabe in Woche 12 (21.3.213). Vorführung der laufenden Programme im Tutorium Woche 14 (4.4.213). Zu erreichende Mindestpunktzahl: 13 von 25 Punkten OpenGL arbeitet nach dem Prinzip einer Statemachine. Das bedeutet, dass nicht bei jedem Funktionsaufruf alle Parameter gesetzt werden müssen, sondern viele Variablen global gehalten werden. Der Grund liegt darin, dass man z. B. nicht für jeden Vertex die Transformation an die Grafikkarte schicken möchte (was langsam wäre) sondern lieber einmal die Transformation festlegt und alle folgenden Vertices ensprechend verarbeitet. In dieser Aufgabe soll die Koordinatentransformation von OpenGL emuliert werden. Auf den kommenden Aufgabenblättern werden wir diese Idee weiterverfolgen und zusätzliche Funktionalität zur Statemachine hinzufügen. Die Beleuchtung und Texturierung der Dreiecke wird dann auf den Blättern 4 und 5 behandelt. Auf diesem Aufgabenblatt werden wir den Rasterizer für die Dreiecke von Aufgabenblatt 1 weiter verwenden. Konkret bedeutet das für diese Aufgabe: Wir setzten die Statemachine in einen bestimmten Zustand, indem wir die Grösse des framebuffers und Parameter für die Transformation der Vertices festlegen. Danach werden die (Objekt-)Koordinaten gegeben durch tarray<f3vector> vertex und die dazugehörige Farbe tarray<frgba> color durch die Renderingpipeline geschickt. Zusätzlich gibt es sechs Listen mit Indizes. Je nach Art der Liste werden verschiedene Primitiven in den Framebuffer gerendert: Punkte (tarray<int> pvi für die Vertices bzw. tarray<int> pci für die Farben), Linien (tarray<tuple2> lvi, tarray<tuple2> lci) und Dreiecke (tarray<tuple3> tvi, tarray<tuple3> tci) Alle diese Listen werden in der Klasse Mesh verwaltet. Diese Klasse wird von uns vorgegeben. Ausserdem stellen wir einen OBJReader zur Verfügung, mit dem man Objekte, die im Alias/Wavefront-Objectformat (*.obj) gespeichert sind, in die Klasse Mesh einlesen kann. Wir haben die Renderingpipeline so gebaut, dass sie OpenGL-kompatibel ist, d.h., die zu implementierenden Methoden entsprechen semantisch OpenGL-Funktionen. Für eine Erklärung der

2 einzelnen zu implementierenden Transformationen verweisen wir auf die Vorlesung, Foliesatz 6. Im StateMachineRenderer werden folgende Buffer verwendet: timage<float> zbuffer; Depth buffer: Hier ist zu jedem Pixel der Abstand zur near- Clippingplane gespeichert (Aufgabe 5). timage<frgba> framebuffer; Hier wird das fertige Bild hineingerendert. timage<f3vector> bbuffer; Zum Testen können Sie hier die Baryzentrischen Koordinaten λ 1, λ 2, λ 3 speichern (Freiwillig). Aufgabe 1 - Modelview Matrix (6 Punkte ) Fügen Sie der KlasseStateMachineRenderer aus Aufgabenblatt 1 folgende Funktionaliät hinzu: Die Modelview Matrix M wird per default (also im Konstruktor der Klasse StateMachineRenderer) auf die Einheitsmatrix gesetzt: 1 M = 1 1 Wenn diese Matrix als Modelview Matrix verwendet wird, bedeutet dass, dass die Kamera im Urprung steht, in Richtung der negativen z-achse schaut und aufrecht steht (d.h (, 1, ) T ist oben). Der Befehl setrotationx(float alpha) erzeugt eine Matrix für eine Rotation der Objekte um die x-achse (mit Rotationswinkel α) und multipliziert die aktuelle Modelview Matrix damit: 1 M := M cos α sin α sin α cos α Der Befehl void setrotationy(float alpha) erzeugt eine Matrix für eine Rotation der Objekte um die y-achse (mit Rotationswinkel α) und multipliziert die aktuelle Modelview Matrix damit: cos α sin α M := M 1 sin α cos α Der Befehl void setrotationz(float alpha) erzeugt eine Matrix für eine Rotation der Objekte um die z-achse (mit Rotationswinkel α) und multipliziert die aktuelle Modelview Matrix damit: cos α sin α M := M sin α cos α 1

(freiwillig:) Der Befehl void setrotation(float alpha, const f3vector& axis) erzeugt eine Matrix für eine Rotation der Objekte um die Achse durch die Punkte ((,, ) T ) und ((x, y, z) T ) und multipliziert die aktuelle Modelview Matrix damit. Der Befehl void settranslation(const f3vector& offset) erzeugt eine Matrix für eine Translation der Objekte und multipliziert die aktuelle Modelview Matrix damit: 1 x M = M 1 y 1 z Der Befehl void setscale(const f3vector& scale) erzeugt eine Matrix für eine Skalierung der Objekte und multipliziert die aktuelle Modelview Matrix damit: x M = M y z 3 Der Befehl void multmodelviewmatrix(const f4matrix& A) Modelview Matrix mit einer Matrix A: multipliziert die aktuelle M := M A Aufgabe 2 - Projektionsmatrix (3 Punkte ) Fügen Sie der Klasse StateMachineRenderer folgende Funktionaliät hinzu: Die Projektionsmatrix P wird per default ebenfalls auf die Einheitsmatrix gesetzt: 1 P = 1 1 Der Befehl setfrustum(float l,float r,float b,float t,float n,float f) erzeugt eine Matrix für die perspektivische Projektion und setzt die aktuelle Projektionsmatrix: P := 2n r l r+l 2n t b r l t+b t b f+n f n 1 2fn f n

Aufgabe 3 - Koordinaten Transformation (6 Punkte ) 4 Ziel dieser Aufgabe ist es, die OpenGL-Renderingpipeline zu implementieren. Dies soll in der Methode render() der Klasse StateMachineRenderer passieren. Das Objekt, das gerendert werden soll, liegt anfangs in Objektkoordinaten (x o, y o, z o ) T in dem Array tarray<f3vector> vertex der Klasse Mesh vor. Schritt1: Modelview Transformation Die Objektkoordinaten werden in Eye Koordinaten (Membervariable tarray<f4vector> eyecoord der Klasse StateMachineRenderer) transformiert. x e y e z e w e = M Schritt2: Projektion Die Eye Koordinaten werden in Clip Koordinaten (tarray<f4vector> clipcoord) transformiert. x c y c z c = P Schritt3: Perspektivische Division Die Normalized device Koordinaten (tarray<f3vector> normdevcoord) sind dann: x d y d = z d Bemerkung: Nach dieser Transforamtion befinden sich die sichtbaren Koordinaten im folgenden Bereich: (x d, y d, z d ) [ 1, 1] [ 1, 1] [, 1] x o y o z o 1 x e y e z e w e x c y c z c

Schritt4: Viewport Transformation Hierzu wird die Breite (p x ) und Höhe (p y ) des Fensters in Pixeln benötigt. (o x, o y ) ist das Zentrum des Bildes, normalerweise: (o x, o y ) = ( px 2, py 2 ). x w y w z w = p x2 x d + o x p y 2 y d + o y f n 2 z d + n+f 2 Dabei ist zu beachten, dass die Koordinaten hier so gewählt sind, wie in der Mathemathik üblich: die y-achse ziegt nach oben. Dagegen ist bei timage der Ursprung oben links, wie bei Matrizen üblich. Die fertig transformierten Koordinaten werden in tarray<f3vector> viewcoord gespeichert. Schritt5: Rastern Die Arrays für Punkte (tarray<int> pvi), Linien (tarray<tuple2> lvi) und Dreiecke (tarray<tuple3> tvi) enthalten die Indizes für die Koordinaten in tarray<f3vector> viewcoord. Die Farben an den jeweiligen End- bzw. Eckpunkten sind durch die Indizes tarray<int> pci, tarray<tuple2> lci, tarray<tuple3> tci gegeben. Verwenden Sie dazu Ihren Rasterizer aus Aufgabenblatt 1. Beispiel für die Verwendung der Indizes: mesh.color[mesh.pci[i]] 5 Aufgabe 4 - Beispiel ( Punkte) Um das Debugging zu erleichtern geben wir hier eine Menge von Koordinaten (die die Ecken einer Pyramide beschreiben). Testen Sie ihren Algorithmus mit dem Testprogramm Transformation Pipeline Test und vergleichen Sie die Ausgabe mit tests.txt. Aufgabe 5 - zbuffer (4 Punkte ) Verwenden Sie die z-komponente der Window Koordinaten um einen zbuffer zu implementieren. Verwenden Sie dazu den zbuffer. Setzen Sie den zbuffer in der Methode setframebuffersize auf die grösse des Framebuffers. In der Methode clear() wird der zbuffer mit dem Wert der far-clipping-plane (c far) initalisiert. Ändern Sie dann Ihre Shaderfunktionen, sodass ein Pixel nur dann gezeichnet wird, wenn nicht bereits ein grösserer Wert im zbuffer eingetragen ist. Stellen Sie sicher, dass nur Punkte gezeichnet werden, deren zbuffer-wert im gültigen Bereich n < z w < f liegt. Aufgabe 6 - Quaternionen (6 Punkte) Ziele dieser Aufgabe ist eine Vertiefung der Vorlesung im Bereich Quaternionen und die Imple-

Allgemeine Hinweise Um ein an einem Bildschirm zu betrachtendes Objekt interaktiv zu rotieren eignet sich das Modell eines Trackballs sehr gut. Daher soll in dieser Übung ein sogenannt virtueller Trackball realisiert werden, indem die Bewegungen einer Maus entsprechend interpretiert werden. Wie in der Folge noch erklärt, müssen dazu die zweidimensionalen Mauskoordinaten in geeigneter Form auf einen virtuellen 6 Trackball mentierung projiziert eines werden. virtuellen Trackballs mittels Quaternionen q = s + v 1 i + v 2 j + v 3 k. Ein Quaternion wird in dieser Übung als Vektor quat[4] vom Typ float behandelt. Dabei haben die Um ein an einem Bildschirm zu betrachtendes Objekt interaktiv zu rotieren eignet sich das einzelnen Koeffizienten die folgende Bedeutung: q[]=x; q[1]=y; q[2]=z und q[3]=c; Im Gegensatz Modell eines zu den Trackballs Vorlesungsunterlagen sehr gut. Daher und soll allen in dieser mathematischen Übung ein Abhandlungen sogenannt virtueller liegt der Trackball Realteil eines realisiert Quaternions werden, also indem an der dieletzten Bewegungen Stelle. Dies einerhat Maus den entsprechend Vorteil, dass alle interpretiert Operationen werden. auf dem Wie Imaginärteil der Folge mittels nochvektoroperationen erklärt, müssen dazu direkt die auf zweidimensionalen q durchgeführt werden Mauskoordinaten können, ohne indass geeigneter Addressarith- Form in metik auf einen notwendig virtuellen wird. Trackball projiziert werden. Das Codegerüst kann wie üblich direkt von der Webseite geladen, in einem persönlichen Verzeichnis gespeichert Das allgemeine und mit Vorgehen der Visual fürc++ die6. Realisierung Programmierumgebung des Trackballs bearbeitet kann wie werden. folgt beschrieben werden: Aus einer Mausbewegung im Viewer-Window muss die Rotationsachse a sowie der Rotationswinkel φ einer virtuellen Kugel ermittelt werden. Die Rotationsachse ergibt sich aus dem Webseite Kreuzprodukt der Vorlesung: der beiden http://graphics.ethz.ch/gdv1 Vektoren x und y, die sich wiederum aus der Projektion der Koordinaten im Viewer-Window auf den virtuellen Trackball ergeben. Der Rotationswinkel kann mittels einfacher trigonometrischer Zusammenhänge berechnet werden. Aus der Rotationsachse sowie dem Rotationswinkel kann ein Quaternion gebildet werden, welches die Rotation vollständig Das allgemeine Vorgehen für die Realisierung des Trackballs kann wie folgt beschrieben werden: Aus beschreibt. Für jedes Teilstück einer Bewegung kann ein neues Quaternion berechnet werden, einer Mausbewegung im Viewer-Window respektive aus einem linearen Teilstück einer kontinuierlichen um die Bewegung aktuelle Rotation muss die zu Rotationsachse beschreiben. Die a sowie einzelnen der Rotationswinkel Quaternionen müssen einer aufmultipliziert virtuellen Kugel ermittelt werden, damit werden. eine Die längere Rotationsachse Bewegung ergibt simuliert sich aus werden dem Kreuzprodukt kann. der beiden Vektoren x und y, die sich wiederum aus der Projektion der Koordinaten im Viewer-Window auf den virtuellen Trackball Um ergeben. das Objekt Der im Rotationswinkel Viewer tatsächlich kann zu drehen, mittels muss einfacher an StateMachineRenderer trigonometrischer Zusammenhänge eine Rotationsmatrixwerden. übergeben werden. Dies bedeutet, dass das berechnete Quaternion in eine Rotations- berechnet Aus matrix der Rotationsachse umgewandelt werden sowie dem muss. Rotationswinkel kann ein Quaternion gebildet werden, welches die Ressourcen Grundlagen Trackball x y Rotationswinkel x y y Viewer-Window Rotationsachse a Ein Teil der benötigten Funktionen ist in der Klassen Trackball<T> und Quaternion<T> (Trackball.h und Trackball.icc) bereits implementiert. Ausserdem ist in GLWindow die Benutzung der Klasse Trackball<T> demonstriert. Implementieren bzw. vervollständigen Sie die folgenden Methoden: Die Methode project(int x, int y) der Klasse trackball<t>. Hier muss die Mauskoordinate in eine 3D-Koordinate auf dem virtuellen Trackball umgewandelt werden. Dabei sollen die Bildschirmkoordinaten auf folgenden, quadratischen Bereich abgebildet werden: (x, y) [ 1, 1] [ 1, 1]. Dadurch vereinfacht sich die Behandlung von nicht quadratischen Bildschirmen und der Bildschirm passt immer in den vorgegebenen, virtuellen Trackball (radius = 2). Den Konstruktor der Klasse quaternion<t>, der ein Quaternion aus einer Rotationsachse

a und dem Rotationswinkel φ baut. 7 s = cos( φ 2 ) v 1 = a x sin( φ 2 ) v 2 = a y sin( φ 2 ) v 3 = a z sin( φ 2 ) Den Operator operator*= der Klasse quaternion<t>, der eine Quaternionen-Multiplikation durchführt (siehe Vorlesung). Die Methode getmatrix() der Klasse quaternion<t>, die ein Quaternion in eine Rotationsmatrix umwandelt: 1 2(v2 2 + v2 3 ) 2(v 1v 2 sv 3 ) 2(v 3 v 1 + v 2 s) M = 2(v 1 v 2 + v 3 s) 1 2(v3 2 + v2 1 ) 2(v 2v 3 v 1 s) 2(v 3 v 1 v 2 s) 2(v 2 v 3 + v 1 s) 1 2(v2 2 + v2 1 ) Die Methode mousemove() der Klasse trackball<t>, welche die Rotationsachse a und den Rotationswinkel φ aus der Mausbewegung und die neue Rotationsmatrix berechnet. Sie können die Variable t3vector<t> last projected verwenden um die letzten virtuellen Trackballkoordinaten zwischenzuspeichern. blatt2/include/quaternion.h blatt2/include/trackball.h