Heute gibt es eine weitere Episode aus dem Leben und Leiden des jungen Schaback, Rubrik Hausarbeit. Gemeint ist nicht Fensterputzen oder Gallseife kaufen, sondern Universitätshausarbeit. Wie in China üblich, sind bei den Hausuafgaben die Augen grösser als der Mund und so bekamen wir über die letzten Ferien die Aufgabe einen Raytracer und einen Szeneneditor für den selbigen zu programmieren. “Ach Gott, wieder so ein Computerblablabeitrag” mag die eine oder die andere von Euch jetzt denken, aber es ist eben die Realität. Computer stellen 60% meines Nerd-Lebens. Die restlichen 40% sind Software, aufgesplittet in 16% Java, 3% C++, 9% Mailsschreiben, 7% Uni-Hausaufgaben und 13% Monkey Island spielen.

Zurück zum Thema. Würde man in einen Zeitbackofen steigen und die Uhr auf minus sechs Wochen stellen, käme man an einem Tag heraus, an dem ich mir die Haare raufe. Das sind diese Tage an denen meine eh schon arg dezimierte Kopfbehaarung kurz davor ist bei Amnesty International einen Antrag auf Denkmalschutz für deutsches Kulturerbe einzureichen. Es muss dazu gesagt werden, dass ich bereits einen Generationsvertrag mit meinen Haaren geschlossen habe; Sie unterlassen das ausfallen und ich gehe nur noch 3x pro Jahr zum Friseur. Diese bedingen war gekopelt an die Nebenbedingung, dass ich mich innerhalb des Vertraglaufszeit ausgewogen ernähre und etwaige sportliche Aktivitäten in Erwägung ziehe.
Diese Nebenbedingung konnte meinersets leider nicht bis Ende der Laufzeit erfüllt werden, sodass ich wieder jeden Morgen ein Stück meines blonden Stolzes aus dem Duschabfluss fummeln muss. Dafür gehe ich jetzt aber auch wieder alle vier Wochen zum Friseur. Links sind zwei Bilder zu sehen. Eines ist vor dem Friseur, das andere ist danach.

Nochmal zurück zum Thema. An diesem besagten Tag, lass ich die Spezifikation der Urlaubshausaufgabe, die als Ersatz zu einem verpassten Kurs dienen sollte, der schlanke zwei SWS beinhaltete. Die Spezifikation zu lesen benötigte allein zwei SWS. Hier ist eine Zusammenfassung dieser Brünhildearie der Computergrafik:

  • readability of source code (5points), convenience of user manual (5 points), experimental report (5 points), system overall performance
  • Interactively create geometries such as box, sphere, cylinder and cone. Arbitrary number of such geometries could be placed into one scene. Geometries can be added, deleted and edited (size, location and rotation).
  • Geometries above could be viewed in wire frame. The view port can be panned, rotated and scaled. The view port could switch between parallel projection and perspective projection.
  • Simple material could be added to specific geometry. Light could be added into the scene (point light and parallel light). Realistic image could be produced by ray-tracingalgorithm with shadow, mirror reflection and transparency.
  • Scene could be saved into file, and read it into your system later.
  • write all necessary reports: plan report, general design report, detailed design report, develop log, test report, source code, executable file, user manual and experiment report.
  • You can choose from the following items to reach 100% of your grade:
    • Environment Mapping (10 points)
    • Bump Mapping (10 points)
    • Displacement Mapping (10 points)
    • Solid Texture Mapping (10 points)
    • Monte Carlo Integration
    • Soft Shadows 10 points
    • Anti-aliasing 10 points
    • Depth of field 10 points
    • Motion Blur 10 points
    • BRDF: glossy reflection (10 points)
    • Photon Mapping (30 points)
    • Hierarchical Bounding Volume 10 points
    • 3D DDA 10 points
    • Octree-based 10 points
    • Binary Space Partitioning(10 points)
    • Shadow Map (15 points)
    • Sadow Volume (15 points)
    • Common Radiosity Arithmetic for unitary illumination (40 points)
    • Implement global diffuse effect using radiosity. The precision should be changeable and the scene could be walk-through in realtime.
    • Advance Radiosity Arithmetic
    • Hierarchical-Structure Radiosity Arithmetic(15 points)
    • Non-Diffuse-Reflection Radiosity Arithmetic(15 points)
    • Radiosity Arithmetic for texture surface(15 points)
    • Radiosity Arithmetic for dynamic scene. (20 points)
    • Finite element Radiosity Arithmetic(15 points)
    • Infinite Undo Functionality (10 points)
    • Implement the undo functionality by parameterize operations. Logging all memory data is not allowed.
    • Hidden Line Removal (10 points)
    • HLR in wireframe viewport, ZBuffer is not allowed to use.
    • Boolean Operation (10 points)
      • Implement Boolean Operation by CSG Tree.
      • Implement Boolean Operation by face intersection.

Gib es zu! Du hast nicht die komplette Liste bis zum Ende gelesen. Nagut, ich auch nicht. 🙂

Das das Englisch nicht immer so flutscht ist völlig okay. Ich will schliesslich keine Spezifikation auf Chinesisch schreiben müssen.

Ich rotzte also nach Chinesischer Manier in die Hände, doppelklickte auf eclipse.exe und begann loszutippeln. Natürlich wie immer in Java. Ein Hund läuft ja auch nicht von heute auf morgen eine andere Route. Die grossen Geschäfte bleiben im Revier.

Das war am Anfang meiner Ferien. Jetzt sind sie zu Ende und ich bin fertig. Wie auch in jedem schlechten Film, blende ich die langweilige und arbeitsame Zwischenzeit aus. Oder habt Ihr schonmal gesehen, wie Mr. Scott ganz genau den Warpantrieb innerhalb von 48 Stunden repariert? Ich nicht, aber es kam einiges bei rum

  • Eine schnuckelige GUI library für OpenGL in Java. Ich nenne sie FengGui.
  • Ein Szeneneditor
  • Ein Raytracer mit Semi Photon Mapping

Hier sieht man den ersten Laufversuch. Ich nenne es “Impression aus dem Paralleluniversum”. Man sieht eindeutig zwei polarisierende Entitäten die gegeneinander über die Vorherschaft über das Licht kaempfen. Gut und Böse durchdringt den Geist der Entitäten und entlädt sich in Reibung an der Glückseligkeit im Auge des Betrachters. Weitere Daten: Pixel auf JPEG, 640×480, Shanghai 2005, Preis: 4,80 Euro.

Hier sieht man den ersten Laufversuch. Ich nenne es “Impression aus dem Paralleluniversum”. Man sieht eindeutig zwei polarisierende Entitäten die gegeneinander über die Vorherschaft über das Licht kämpfen. Gut und Böse durchdringt den Geist der Entitäten und entlädt sich in Reibung an der Glückseligkeit im Auge des Betrachters. Weitere Daten: Pixel auf JPEG, 640×480, Shanghai 2005, Preis: 4,80 Euro.

Stillleben mit Klötzen, Kegel und Kugel. Ich glaube dieses Bild ist entstanden, weil ich so stolz war, dass mein Kegel endlich funktioniert.

Hier sehen wir eine Kugel dessen Glas das Licht bricht. Dazu kommt noch eine Priese Reflektion.

Dieses Bild trögt den Titel “Weltuntergang durchAngriff der Texturmonster”. Die Texturmonster greifen mit ihrem Apfelmännchenschiff und der Garageneinfahrtkugel die Erde an. Diese Bild braucht 20 Sekunden um gerendert zu werden.

Auf dieses Oevre bin ich besonders stolz. Durch das Bump Mapping werden die Normalenvektoren der Kugeloberfläche
versetzt. Das ändert auch den Eintrittswinkel des Lichtes.

Den gleichen faulen Trick kann man natürlich auchbei Reflektionen anwenden, wie auf diesem Bild zu sehen ist.

Nachdem ich FengGui fertig hatte, musste man sich bei Benutzung des GUIs nicht mehr übergeben. Der Modeler ist komplett in OpenGL und Java programmiert, ohne hinzunahme externer Drogen oder Bibliotheken. Hier sehen wir den Modeler, in den mein Raytracer bereits integriert wurde, da in einem Fenster das geraytracte Bild erscheint. Übrigens ist jedes Bild in FengGui eine OpenGL Texture. Das gilt auch für jeden einzelnen Buchstaben, der wie ein kleines Bild behandelt wird.

Hie wollte ich die Möglichkeit nochmal hervorheben, dass man die primitives auch als wireframes darstellen kann. Das ist aber eigentlich kein grosses Kino, da OpenGL für jede draw routine eines primitives auch eine draw routine des selben primitives für
wireframe Darstellung bereitstellt.

Mein erster Versuch mit Photon Mapping fuhr gegen die Wand. Schuld war der kaputte K-D Tree. K-D kommt übrigens von K-Dimensionen. Ich habe extra eine eigene Java 5.0 (mit Generics) Variante eines K-D Trees geschrieben, die echte K-Dimensionen erlaubt mit beliebigem Datentypen ohne casten *angeb*. Leider funktioniert er prima im drei Dimensionen mit wenigen Elementen. Bei mehr als 20 Elementen wird es schwierig den Tree zu debuggen. Leider trat der Fehler erst bei 100.000 Elementen auf. Keine Chance also bei dem knappen Zeitrahmen.

Nachdem ich den K-D Tree durch ein ordinäres Array ersetzte, konnte ich bei jedem Renderdurchlauf eine Tasse Kaffee trinken gehen. Es dauerte ca. eine Minute ein Bild zu “photon mappen”.

Einige Tests später …

… war es dann soweit: Ich hatte keine Zeit mehr. Um das Photon Mapping zu komplettieren, hätte ich noch ein paar Stündchen gebraucht, aber ich konnte bereits den schlechten Atem der Deadline riechen. Also entschloss ich mich alles in ein ZIP file zu packen und abzuschicken.

Diese und andere Bilder des Projekts gibt es hier zu betrachten.

Categories: China

3 Comments

Andreas · April 6, 2010 at 4:28 pm

Huhu,
die Screenshot sind irgendwie nicht mehr in deinem Artikel drin … gibts den Code auch irgendwo?
Grüße aus Leipzig
Andreas

schabby · April 6, 2010 at 8:39 pm

Damn, ja stimmt, die Fotos fehlen ALLE :(( Sorry!

Das liegt am Serverumzug… daher auch die Encondingfehler.

Ich geb mein Bestes 🙂

Johannes

schabby · April 6, 2010 at 8:40 pm

Den Code müsste ich auch noch auftreiben irgendwo… Ist halt leider schon ein paar Jahre her 🙂

Leave a Reply

Your email address will not be published. Required fields are marked *