Linsenreflexionseffekt zur Umgebungsbox hinzufügen

In diesem Tutorial möchte ich dir zeigen, wie du einen bereits vorhandenen oder auch selbst erstellten Linsenreflexionseffekt zur der Umgebungsbox deiner Map hinzufügen kannst. Bevor du aber loslegst, solltest du sicherstellen, dass du den Q3Map2-Compiler mindestens in Version 2.5.16 und den GtkRadiant 1.4 oder neuer für World of Padman installiert und konfiguriert hast. Mit älteren Versionen könnte es bei der Anwendung dieses Tutorials zu Fehlern kommen.

Linsenreflexionen in World of Padman

Als Linsenreflexion (engl. lens flare) oder auch Blendenfleck wird die sichtbare Reflexion und Streuung des Lichtes einer Punktlichtquelle in einem Linsensystem bezeichnet. Während das Auftreten von Linsenreflexionen in der Fotografie oft als störend empfunden wird, findet dieser Effekt in Computerspielen ganz bewusst Anwendung. Er soll zur optischen Verschönerung beitragen, obwohl für den Spieler eigentlich gar kein Linsensystem existiert, ergo der Effekt gar nicht auftreten kann. In der Realität kann die Form der Linsenreflexion stern-, ring- oder kreisförmig sein und die Farbgebung stark variieren. Grundsätzlich führt das Auftreten an den betroffenen Stellen zu einer Verminderung des Farbkontrastes.

Linsenreflexionseffekt der Umgebungsbox in ENTEs PadGarden

Linsenreflexionseffekt der Umgebungsbox in ENTEs PadGarden

World of Padman besitzt ein eigenes System zur Darstellung von Linsenreflexionen, das von unserem Coder #@ (raute) implementiert wurde. Die Möglichkeiten dieses Systems können sehr komplex sein, daher beschränke ich mich im Folgenden auf das Einbinden eines bereits in WoP vorhandenen Linsenreflexioneffekts. Für detailliertere Informationen verweise ich auf die Dokumentation von #@.

Alle Linsenreflexionen sind in WoP per Skript umgesetzt. Bisher nutzen alle Mapper des WoP-Teams den gleichen Linsenreflexionseffekt Photoshop/50-300mmZoom für alle Umgebungsboxen, die  über einen hellen Tageshimmel verfügen und einen direkten Blick auf eine Punktlichtquelle, wie zum Beispiel die Sonne, zulassen. Die zugehörige Skript-Datei heißt photoshop.lensflare und befindet sich im Unterverzeichnis scripts. Da die Texturen für den Effekt damals mit Photoshop erstellt wurden, kam diese Namensgebung zustande.

Lensflare-Skript einbinden

Zunächst musst du zwei Keys in den Worldspawn deiner Map eintragen. Dies kannst du im GtkRadiant 1.4, in dem du einfach, ohne vorher etwas ausgewählt zu haben, die Taste N drückst und somit den Entities-Inspektor öffnest. Beim GtkRadiant 1.5 bzw. NetRadiant 1.5 musst du vorher einen Brush des Worldspawns selektiert haben, bevor du den Entities-Inspektor öffnest. Füge für die folgenden Keys die benannten Werte hinzu:

skylensflare       Photoshop/50-300mmZoom
skylensflare_dir   -0.463591927 -0.324418826 0.927183854

Der Key skylensflare verlangt hier, wie bei Shadern bereits bekannt, nach der Angabe des Pfads in der Skriptdatei, hier Photoshop/50-300mmZoom, nicht nach dem Pfad oder Dateinamen des Skripts (hier: photoshop.lensflare)! Der Key skylensflare_dir verlangt nach der Angabe von Koordinaten, die die Position der Punktlichtquelle, wie zum Beispiel die der Sonne, auf der Umgebungsbox definieren. Oben angegeben Werte stammen aus der TrashMapBB und passen zu den für q3map_sun (bzw. q3map_sunExt) definierten Werten des zugehörigen Shaders der Umgebungsbox.

Worldspawn-Keys skylensflare und skylensflare_dir mit Werten im Entities-Inspektor des NetRadiants 1.5

Worldspawn-Keys skylensflare und skylensflare_dir mit Werten im Entities-Inspektor des NetRadiants 1.5

Für deine Map musst du jetzt nur noch die zutreffenden Werte herausfinden. Die Koordinaten lassen sich durch das Kommando cg_printDir 1 bei einem Test im Spiel recht einfach ermitteln, sofern du deine Map mit sv_pure 0 und devmap meinemap gestartet hast. Im Spiel musst du dich dann nur noch in die Mitte der Map stellen, die vorhandene Punktlichtquelle (Sonne etc.) anvisieren und die abgelesenen Vektorkoordinaten anschließend als Werte für skylensflare_dir in den Worldspawn übertragen.

Anzeige der Vektorkoordinaten der Blickrichtung des Spielers durch cg_printdir 1

Anzeige der Vektorkoordinaten der Blickrichtung des Spielers durch cg_printdir 1

Sollte deine Umgebungsbox über keine sichtbare Punktlichtquelle (Sonne etc.) auf der Textur verfügen, solltest du anders herum vorgehen. Da der Linsenreflexionseffekt Photoshop/50-300mmZoom automatisch einen hellen Punkt auf der Umgebungsbox erzeugt, der als Sonne herhalten kann, solltest du zuerst die Polarkoordinaten des Punktes festlegen, von dem später direktes Licht in die Map ausgestrahlt werden soll. Gemeint sind hier die Angaben für q3map_sun (bzw. q3map_sunExt) im Shader der Umgebungsbox. Wenn du jetzt auf weitere Mathematikspielchen verzichten willst, muss du anhand des Schattenwurfs in deiner Map schlicht und einfach schätzen und dich über Testen an die tatsächliche Sonnenposition annähern, um q3map_sun (bzw. q3map_sunExt) und skylensflare_dir übereinander zu bekommen. Falls dir aber Winkelfunktionen wie Sinus und Cosinus ein Begriff sind, dann schau dir den nächsten Abschnitt an.

Umrechnung von Polar- in Vektorkoordinaten

Sind zufällig die Polarkoordinaten der q3map_sun (bzw. q3map_sunExt) Funktion aus dem Shader der Umgebungsbox bekannt, so können aus den Werten von Horizontalwinkel und Höhenwinkel die benötigten Vektorkoordinaten für skylensflare_dir mithilfe der folgenden Gleichungen umgerechnet werden:

X = SIN(Höhenwinkel) x SIN(Horizontalwinkel)
Y = COS(Höhenwinkel) x COS(Horizontalwinkel)
Z = SIN(Höhenwinkel)

Für einen Horizontalwinkel von 210° und einen Höhenwinkel von 68°, wie bei der BB-Version der TrashMap, ergeben sich dann die folgenden Vektorkoordinaten:

X = SIN(68°) x SIN(210°) = -0,463591927
Y = COS(68°) x COS(210°) = -0,324418826
Z = SIN(68°)             =  0,927183854

Diese Koordinaten können dann in den Worldspawn übernommen werden. Bitte beachte die amerikanische Schreibweise mit Dezimalpunkt anstelle des Kommas!

skylensflare_dir   -0.463591927 -0.324418826 0.927183854
Horizontal- und Höhenwinkel der Sonne in der TrashMapBB

Horizontal- und Höhenwinkel der Sonne in der TrashMapBB