Level-Editor mit Raytracer
-
Hallo!
Es gibt jetzt einen ersten Download zu meinem neuen Spiel "Missile II" - es ist der mitgelieferte Level-Editor. Die Levels bestehen aus Polygonen, denen man Materialien zuweisen kann, die wiederum durch ein Skript definiert sind.
Weiterhin lassen sich beliebige Objekte platzieren. Die Objekttypen werden aus speziellen Dateien geladen, so dass der Editor und das Spiel sehr gut erweiterbar sind. Objekte haben ein integriertes Skript, das z.B. bei einer Reparatur-Station die Gesundheitspunkte des Spielers erhöht.
Der Editor ist sehr benutzerfreundlich und bedient sich fast wie 3ds max. Per Mausklick lassen sich Objekte verschieben, rotieren (auch mit Punkt- und Winkelfang), klonen, löschen etc..Zum Spiel selbst: es handelt sich hierbei um ein Remake des Klassikers "Gravity Force". Man muss eine Rakete mit begrenztem Treibstoff durch Höhlen manövrieren, ohne zu starken Schaden durch Kollision mit den Wänden zu nehmen und ohne von den Gegnern abgeschossen zu werden. Natürlich gibt es auch Waffen (z.B. zielsuchende Raketen oder ein automatisches Verteidigungsgeschütz). Ziel ist es, mit der eigenen Rakete die Basis des Gegners zu zerstören (indem man sie einfach rammt - denn die Rakete, die man steuert, hat selbst ebenfalls einen Sprengkopf).
Es gibt beliebig viele Gravitationsquellen (sowohl Richtungsgravitation als auch Punktgravitation), die das Spiel interessant machen. Schießt man beispielsweise auf einen Gegner, dann kann es passieren, dass der Schuss durch eine Gravitationsquelle abgelenkt wird und möglicherweise sogar eine Umlaufbahn um die Quelle einschlägt.Für die Physik verwende ich ein relativ realitätsgetreues Modell.
Das Spiel findet eigentlich nur in zwei Dimensionen statt, die Levels und die Objekte sind jedoch dreidimensional, ebenso die Bewegung der Kamera. Sowohl das Spiel als auch der Editor verwenden OpenGL (das ist eine Premiere für mich, an dieser Stelle eine Dankeschön an Patrick, der mir OpenGL nahegelegt hat! ;)).Es ist jetzt sogar ein Echtzeit-Raytracer dabei (nur als kleiner Gag, habe ich diese Nacht innerhalb von 4 Stunden geschrieben :D). Startet das Programm und klickt dann oben im Menü auf "?" und dann auf "Info...". Dann öffnet sich ein Fenster mit einer in Echtzeit gerenderten Animation.
Der Raytracer kann bisher nur Kugeln und Ebenen rendern. Er funktioniert so, dass die Objekte mit einer beliebigen Matrix transformiert werden können (sie können auch gestreckt und gestaucht werden!). Genauer gesagt werden nicht die Objekte transformiert, sondern die abgeschossenen Strahlen - und zwar mit der invertierten Matrix. Das hat einen großen Vorteil: die Schnittpunktberechnungen sind viel einfacher, da man bei einer Kugel beispielsweise immer den Radius 1 annehmen kann und den Mittelpunkt (0, 0, 0). Die Strahlentransformation erledigt den Rest.
Außerdem gibt es noch Punkt- und Richtungslichter (die Punktlichter mit linearem und quadratischem Abfall über die Entfernung), die natürlich auch Schatten werfen. Reflexionen werden ebenfalls unterstützt (bisher noch keine Refraktionen). Die maximale Rekursionstiefe ist frei wählbar.
Für die Schatten verwende ich einen Blocker-Cache, der das letzte blockende Objekt speichert.
Die Kamera kann durch eine Matrix ebenfalls beliebig gewählt werden (Position, Blickpunkt, Rotation um die z-Achse, Zoom...). Verfeinert wird das Ganze noch durch einen simplen Motion-Blurring-Effekt.
Es läuft zwar (noch) nicht sehr schnell, aber immerhin!
Die C++-Quellcodedatei des betreffenden Programmstücks habe ich auch mal mit reingepackt.Hier der Download:
http://www.scherfgen-software.net/misc/missile_ii_level_editor.zipViel Spaß!
Bitte meldet mir eventuelle Bugs.
Der Level-Editor kann noch nicht exportieren (nur laden und speichern).
-
Bin zu blöd...
*wein* - wie kann ich denn da was reinsetzen?!?!
-
"Create polygon": Im Fenster durch Klicken ein Polygon definieren. Am Ende dann einfach wieder den ersten Punkt anklicken, um das Polygon zu schließen.
"Create object": Objekt vom ausgewählten Typ erstellen.
Rechte Maustaste auf Polygon, um es zu klonen, zu löschen oder um ihm ein Material zuzuweisen (alles per Kontextmenü).Läuft der Raytracer?
Mittlerweile wurde er noch etwas mehr optimiert, sodass er schneller arbeitet. Die neue Version ist aber noch nicht hochgeladen.
-
TomasRiker schrieb:
Läuft der Raytracer?
bei mir geht er, ruckelt nur a bissi
[edit]zu dumm zum schreiben
-
TomasRiker schrieb:
"Create polygon": Im Fenster durch Klicken ein Polygon definieren. Am Ende dann einfach wieder den ersten Punkt anklicken, um das Polygon zu schließen.
"Create object": Objekt vom ausgewählten Typ erstellen.
Rechte Maustaste auf Polygon, um es zu klonen, zu löschen oder um ihm ein Material zuzuweisen (alles per Kontextmenü).Läuft der Raytracer?
Mittlerweile wurde er noch etwas mehr optimiert, sodass er schneller arbeitet. Die neue Version ist aber noch nicht hochgeladen.Tatsächlich, jetzt geht's.
Eben hat es nicht auf Mausklicks reagiert.
Liegt wohl daran, daß ich soviel Scheiß installiere und dauernd zwischen XP, ME und Linux hin- und herwechsle...Jau, der RT funzt, nur wie gesagt ziemlich ruckelnd...
...
-
Der Raytracer wird noch optimiert werden. Raytracing in Echtzeit ist eben nicht so einfach, wenn man auch noch Reflexionen etc. einbaut.
-
So, es wurden jetzt ein paar Verbesserungen vorgenommen!
Wenn man die Shift-Taste beim Rotieren von Objekten drückt, rasten sie bei 0°, 45°, 90°,... automatisch ein (damit man exakte Winkel hinkriegen kann).Beim Raytracing wurde die Szene verändert. Der Raytracer rendert jetzt auf eine Textur der Größe 256x128, die dann leicht gestreckt wird. Den Blurring-Effekt habe ich entfernt.
Quellcode vom Raytracer liegt bei!
http://www.scherfgen-software.net/misc/missile_ii_level_editor.zip
-
TomasRiker schrieb:
Der Raytracer wird noch optimiert werden. Raytracing in Echtzeit ist eben nicht so einfach, wenn man auch noch Reflexionen etc. einbaut.
Mir schon klar. Ich wollte es ja nur anmerken.
-
So, der Raytracer benutzt jetzt Adaptive Subsampling!
Die Bildqualität nimmt dadurch zwar ab, aber die Framerate steigt enorm (bei mir zumindest). Man kann es sich so vorstellen: zuerst wird nur alle 8x8 Pixel ein Strahl abgeschossen. Wenn dann zwischen diesen Pixeln zu viel Unterschied besteht (z.B. verschiedene Objekte, die getroffen werden, oder ein Übergang zwischen Licht- und Schattenzone), dann werden die 8x8 Pixel in vier 4x4-Pixel-Quadrate aufgeteilt. Hier dann wieder dasselbe - wenn nötig bis auf 1x1.Hier ein Bild, wo man das gut sehen kann:
http://www.scherfgen-software.net/misc/missile_ii_raytracer_1.jpgUnd hier nochmal der Download:
http://www.scherfgen-software.net/misc/missile_ii_level_editor.zip
-
Jo, deutlich besser!
Aber wat dat geilste ist:
Das einzige was Du z.Z. an Deinem Projekt weiter entwickelst ist die "About..."-Box!!
-
Jo, irgendwie lächerlich
Aber es macht so viel Spaß, Raytracer zu programmieren. Vielleicht baue ich irgendwann mal eine richtige Library daraus, mit 3DNow!-Optimierung, Octrees etc.. Und dann irgendwann ein Spiel, das mit Realtime-Raytracing läuft.
-
TomasRiker schrieb:
Jo, irgendwie lächerlich
Aber es macht so viel Spaß, Raytracer zu programmieren. Vielleicht baue ich irgendwann mal eine richtige Library daraus, mit 3DNow!-Optimierung, Octrees etc.. Und dann irgendwann ein Spiel, das mit Realtime-Raytracing läuft.Et wird echt Zitt...!
-
Sieht echt gut aus.
Wie entstehen denn später aus den 2D Polygonen im Editor die 3D-Level im Spiel?TomasRiker schrieb:
Vielleicht baue ich irgendwann mal eine richtige Library daraus, mit 3DNow!-Optimierung, Octrees etc.. Und dann irgendwann ein Spiel, das mit Realtime-Raytracing läuft.
Nimm den Raytraycer doch gleich für das Spiel jetzt. Bis das fertig ist, haben wir eh alle einen Athlon 128 HT FX YZ 33GHz
Und wenn doch nicht, dann bringst Du einfach einen Beta-Leak raus und sagst, dass das Spiel leider aufgrund von Sicherheitslücken um einige Jahre verschoben werden muss (so wie es die Profis eben machen).
-
0x00000001 schrieb:
Sieht echt gut aus.
Wie entstehen denn später aus den 2D Polygonen im Editor die 3D-Level im Spiel?Durch Extrusion. Die Dicke lässt sich ja über das Kontextmenü bestimmen (von 1 bis 10). Man verschiebt das Polygon immer ein Stückchen entlang der z-Achse und "verkleinert" es. Verkleinern heißt hier nicht Skalieren, sondern das Verschieben der Eckpunkte gegen die Normalenvektoren, die sie im Polygon einnehmen.
Nimm den Raytraycer doch gleich für das Spiel jetzt. Bis das fertig ist, haben wir eh alle einen Athlon 128 HT FX YZ 33GHz
Und wenn doch nicht, dann bringst Du einfach einen Beta-Leak raus und sagst, dass das Spiel leider aufgrund von Sicherheitslücken um einige Jahre verschoben werden muss (so wie es die Profis eben machen).
Hehe, das wär' ne Idee, aber so lange will ich nicht warten ;). Was aber sehr wohl möglich wäre: Raytracing irgendwie mit Vertex- oder Pixelshadern implementieren. Dann könnte man auch die Hardware sinnvoll einsetzen und der Hauptprozessor hätte mehr Zeit für die restlichen Dinge.
-
Es gibt wieder ein Update!
Man kann nun sehr viele Parameter des Raytracers in der Benutzeroberfläche einstellen. Wer sich für Raytracing interessiert, dem dürfte das viele Dinge klarer erscheinen lassen.
Man kann nun einstellen:- Animation ein/aus
- schrittweise die Animation abspielen
- Lichter ein/aus (einzeln)
- maximale Render-Tiefe (Reflexionen, Reflektionen von Reflexionen...)
- adaptive Subsampling ein/aus
- Gittergröße (von 1x1 bis 64x64 Pixel)
- Subsampling-Unterteilungslinien ein/ausQuellcode ist natürlich auch wieder dabei!
Bild:
http://www.scherfgen-software.net/misc/missile_ii_raytracer_2.jpgDownload:
http://www.scherfgen-software.net/misc/missile_ii_level_editor.zip
-
TomasRiker schrieb:
Quellcode ist natürlich auch wieder dabei!
Top!
Da bedank' ich mich jetzt mal im Namen aller, die sich das reinpfeifen, für:
Danke, David! *imkanonträller*
P.S.: Auch, wenn ich sicher nicht dazu gehör'...
-
Das war's aber noch lange nicht!
Die neue Version zeigt auch die Statistiken an. Außerdem wurde die Auflösung erhöht, aber die Framerate ist trotzdem noch gestiegen, weil ich die Algorithmen noch entscheidend optimieren konnte.Bild:
http://www.scherfgen-software.net/misc/missile_ii_raytracer_3.jpgDownload:
http://www.scherfgen-software.net/misc/missile_ii_level_editor.zip
-
Bau doch mal noch Texturen ein!
Bye, TGGC (Der Held ist zurück)
-
Ja, das hatte ich vor. Heute habe ich erste Experimente damit gemacht, aber ganz so einfach ist es nicht. Man wird praktisch "gezwungen", die Texturen von der Grafikkarte rendern zu lassen, denn sonst würde das Adaptive Subsampling nicht mehr richtig funktionieren.
Die Texturen von der Hardware rendern zu lassen, hat Vor- und Nachteile: ein Vorteil ist, dass es schnell ist und dass man sogar schöne Filter benutzen kann, ohne auf das Subsampling zu verzichten (ich verwende ja OpenGL, um die einzelnen Quadrate zu zeichnen, und dann werden die Texturkoordinaten automatisch mit interpoliert).
Nachteil: es ist mit mehr Aufwand verbunden als einen Software-Texture-Sampler zu schreiben (der aber, wie schon gesagt, nicht gut funktionieren würde - die Texturen wären dann allesamt verwaschen), und man muss einige Limitierungen in Kauf nehmen.Ich hatte am Anfang keine Texturen mit eingeplant, darum ist es jetzt sehr schwer, sie noch einzubauen. Die werden dann integriert, wenn ich meine RTRT-Library schreibe (dann schreibe ich sowieso alles neu).
Texturen auf einer Ebene klappen schon (d.h. nur "direkt" sichtbare). Wenn sich etwas in einem Objekt spiegelt, dann hat das Gespiegelte aber noch keine Textur. Entweder mache ich das mit Multi-Pass-Alpha-Blending, oder mit Multi-Texturing.