UNIVERSITÄT BASEL Prof. Dr. Thomas Vetter Departement Mathematik und Informatik Bernoullistrasse 16 CH – 4056 Basel Clemens Blumer Tobias Maier Fabian Brix http://informatik.unibas.ch/lehre/fs13/cs231/ Computer Graphik (CS231) 2013 - Projektübungsblatt 6 Ausgabe in Woche 18 (02.05.2013). Vorführung der laufenden Programme im Tutorium Woche 20 (16.05.2013). Zu erreichende Mindestpunktzahl: 10 von 20 Punkten In der Vorlesung wurde ein alternatives Verfahren zur Erzeugung von realistischen Bildern vorgestellt: Ray Tracing bzw. Ray Casting. Worin unterscheidet sich dieses Verfahren von dem auf den Blättern 1-5 verfolgtem Ansatz? Ziel dieses Aufgabenblattes ist es, einfaches Ray Tracing zu implementieren. Aufgabe 1 - Schnitt Strahl / Dreieck (7 Punkte ?) Implementieren Sie die Klassen Triangle und Sphere in RayTrace.{h,cpp}, so dass diese eine Funktion intersect(...) zum ermitteln des Schnittpunkt zwischen Strahl und Dreieck bzw. Kugel zur Verfügung stellen (siehe Folien 10, Verdeckungsrechnung 2). Implementieren Sie die Funktion so, dass Sie sie in Aufgabe 2 verwenden können. Benötigte Dateien: • blatt6/src/RayTrace.cpp Aufgabe 2 - Ray Casting (5 Punkte ?) Fügen Sie der Klasse StateMachineRenderer eine Funktion void rayTrace() hinzu. Diese Funktion soll (analog zu void render()) ein Bild rechnen und es in den (framebuffer) schreiben. Die Methode rayTrace() kann dann alternativ zu render() vom Testprogram aufgerufen werden. Ray Casting funktioniert dann so wie auf den Folien 10; Seite 4 beschrieben: Für jedes Pixel im Framebuffer schicken Sie einen Strahl von der Kamera (Position (0, 0, 0)T ) durch die (virtuelle) near-Clipping-Plane. Diese ist definiert durch die Parameter near, left, right, top und bottom (vgl. void setFrustum(..)). Berechnen Sie mit Hilfe der Klassen Triangle und Sphere aus Aufgabe 1 diejenigen Dreiecke, die durch den Strahl getroffen werden. Dazu müssen Sie für jedes Pixel im Framebuffer die Liste der Dreiecke (mesh) und Kugeln (tArray<Sphere> spheres) durchgehen und den Strahl mit den Objekten (in Eye Koordinaten; tArray<f4Vector> eyeCoord) schneiden. Das ist natürlich ziemlich ineffizient. Überlegen Sie sich, wieso es nicht so einfach ist, das zu beschleunigen. 2 Der Pixel im Framebuffer wird dann mit der entsprechenden Farbe des Dreicks (Color oder Textur) eingefärbt. Benötigte Dateien: • blatt1/src/StateMachineRenderer.cpp Aufgabe 3 - Ray Tracing (5 Punkte ?) Verfolgen Sie nun den Strahl rekursiv weiter. Dabei nehmen wir eine ideal spiegelnde Oberfläche an. Beschränken Sie die Rekursionstiefe sinnvoll, z.B. auf 6. Färben Sie das Pixel im Framebuffer dann ein mit: F arbe(Strahl(P ixel)) = (1 − ref lectance) · F arbe(getrof f enesDreieck(Strahl)) +ref lectance · F arbe(gespiegelterStrahl(Strahl)) Benötigte Dateien: • blatt1/src/StateMachineRenderer.cpp Aufgabe 4 - Environmental Mapping (3 Punkte) Wir haben noch nicht definiert, was passiert, wenn der Strahl das Objekt nicht trifft, sich also mit keinen der Dreiecke schneidet. In dieser Aufgabe wollen wir dafür eine Art Environmental Mapping verwenden. Dazu wollen wir Photos wie die unten abgebildeten verwenden (die Bilder sind von Swisscom Broadcast). Die Idee ist, (wie der Name ja schon sagt) aus der Environmental Map Farbinformationen über die Umgebung auszulesen, wenn der Strahl das Objekt verlässt. Zunächst sollen Sie den Winkel des Strahls s = (sx , sy , sz )T bzgl. des Koordinatensysytems berechnet, und daraus die entsprechenden Koordinaten auf den Bildern (unter der Annahme einer Kugel). 3 tan α = p sy + s2z s2x tan β = −sz sx Die entsprechenden Koordinaten auf den Bildern (unter der Annahme einer Kugel) sind: r = 235px · 2α π x = 275px + r · cos(β) y = 275px − r · sin(β) Benötigte Dateien: • blatt1/src/StateMachineRenderer.cpp