Blatt 6 - Universität Basel | Informatik

Werbung
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
Herunterladen