Tag & Nachtwechsel
Home Nach oben

 

Nach oben
Dungeons
Detailmap
Einführung
Multitexture Terrain
Plantbox
Aussenlevel (Block)
Tag & Nachtwechsel
KI
Waving Grass
Framerate

Tag & Nachtwechsel

Weicher Tag & Nachtwechsel

Eigene Skydome Texture definieren

Verwendung von Sichtweitenbegrenzung und Nebel

Himmelstextur und Weitsicht

 

Tag & Nachtwechsel

Für die Stimmung innerhalb eines Außenlevels ist eine Änderung der Lichtverhältnisse ein wesentlicher Effekt. Dies kann über verschiedene vordefinierte SKY Strukturen ab der Version 6 einfach erreicht werden.

Ich habe in meinem Projekt die Skydome Texturen auf www.terminal26.de verwendet. Ob Skydome oder Skycube ist für den Wetterwechsel nicht relevant. 

Grundsätzlich sind aber Skycubes wesentlich einfacher selbst zu erzeugen.

1. Schritt Sky definieren

Im ersten Schritt müssen jetzt alle SKY die für den Wetter- bzw. Tag & Nachtwechsel benötigt werden in C-Script definiert werden. Hierbei können Dome und Cube beliebig vermischt werden. Die unten verwendeten Texturen (skydome01.tga und skydome02.tga) können auf www.terminal26.de heruntergeladen werden.

Definition der Sky

sky skybox1 {
    type = <skydome01.tga>;
    flags = dome,visible;
    layer = 1; //dependent on the other Layers
    scale_x = 4;
    scale_y = 4;
    speed_u = 0;
    speed_v = 0;
}

sky skybox2 {
    type = <skydome02.tga>;
    flags = dome,visible;
    layer = 1; //dependent on the other Layers
    scale_x = 4;
    scale_y = 4;
    speed_u = 0;
    speed_v = 0;
}

sky skybox3 {
    type = "skynachtalpha+6.tga";
    flags = cube, visible;
}

2. Schritt Sky umschalten

Das wechseln der Sky ist in C-Script völlig problemlos. Bei dem gewünschten Sky muss nur das visible Flag gesetzt werden. Wichtig ist es bei allen nicht benötigten Sky das visible Flag auf OFF zu setzen.

Umschalten der SKY:

function sky1() {
    skybox1.visible=ON;
    skybox2.visible=OFF;
    skybox3.visible=OFF;
}

function sky2() {
    skybox1.visible=OFF;
    skybox2.visible=ON;
    skybox3.visible=OFF;
}

function sky3() {
    skybox1.visible=OFF;
    skybox2.visible=OFF;
    skybox3.visible=ON;
}

 

Bild: Szene mit den unterschiedlichen Sky-Strukturen


Szene am Tag (Sky1)

Szene am Abend (Sky2)

Szene in der Nacht (Sky3)

 

Weicher Tag & Nachtwechsel

In der oben dargestellten Methode erfolgen die Wechsel äußerst schlagartig. Deshalb ist es ratsam die Übergänge zwischen zwei SKY-Texturen abzumildern und überzublenden. Dabei werden beide SKY transparent gesetzt.

Bei dem auszublendenden SKY wird der Alphawert jetzt kontinuierlich verkleinert und bei dem ein- zublendenden SKY jetzt kontinuierlich vergrößert. Dadurch verschwindet die alte SKY-Textur und wird durch die neue ersetzt. Die Laufzeit der Schleife muss dann noch den jeweiligen Bedürfnissen angepasst und über die time Variable von der möglichen Framerate des Rechners unabhängig gemacht werden.

Codebeispiel Überblendung von Texturen

skybox4.transparent=ON;
skybox2.transparent=ON;
var i=1;
skybox4.alpha=0;
skybox2.alpha=100;
while(i<100) {
    skybox4.alpha+=1;
    skybox2.alpha-=1;
    i=i+1;
    wait(1);
}
skybox4.transparent=OFF;
skybox2.visible=OFF;

 

Eigenen Skycube definieren

Für die Nacht konnte ich keine Texturen finden und wollte deshalb einen eigenen Skycube definieren und Ihn komplett Schwarz füllen. In der Skycubetextur wird der Himmel als Rechteck abgewickelt und es können jetzt alle Außenseiten, der Boden und der Himmel gefüllt werden.

Daher muss die Skycubetextur aus 6 gleich großen Quadraten bestehen deren Größe ein Faktor von 2 sein sollte. Es eignen sich hier Größen von 256x256, 512x512 oder größer, da sonst die Details nicht ausreichen und der Himmel pixelig aussieht.

Die Himmelstextur muss (oder sollte?) im TGA Format erstellt werden.

Bild: Meine Himmelstextur für die Nacht  in 3072 x 512 Pixeln

Jetzt habe ich die Textur noch wie gehabt eingesetzt uns sofort ausprobiert.

sky skybox3 {
    type = "skynacht+6.tga";
    flags = cube, visible;
}

Ein Blick auf das Resultat ist sehr ernüchternd. Meine erste Himmelstextur scheint obwohl sehr einfach gestrickt nicht wirklich verwendet zu werden. Vielmehr erscheint der bekannte Standardhimmel des WED.

Bild: Szene mit der erzeugten schwarzen Himmelstextur

Ein kurzer Vergleich meiner Himmelstextur mit einer funktionierenden die ich mir aus einem Tutorial organisiert habe zeigt den Unterschied. Offensichtlich muss in der Textur ein Alpha-Kanal vorhanden sein damit Sie auch im Skycube zur Verwendung kommen kann.

Der Alpha-Kanal kann z.B. in PaintShopPro erstellt oder von einer vorhanden Himmelstextur importiert werden.

Nach hinzufügen des Alpha-Kanals ist dann auch meine erste eigenen Himmelstextur funktionstüchtig.

Verwendung von Sichtweitenbegrenzung und Nebel

Neben der Himmelstextur ist für den Tag & Nachtwechsel auch die Einstellung der Sichtweite und des Nebels wesentlich um die Szene stimmungsvoll anzupassen.

Bild: Nachtansicht mit den Sichtweiten- und Nebeleinstellungen Tag

Die Details im Hintergrund werden noch mit dem weißen Schatten des Tagesscriptes dargestellt. Zusätzlich ist die Sichtweite für die Nacht zu groß.

Script zur Veränderung der Sichtweiten- und Nebeleinstellungen

// Tag

function fog1() {
    fog_color = 1;                                // Nutze Nebel 1 aus den Map-Properties
    camera.fog_start = 3000;            // Starte den Nebel bei 3000 Quad
    camera.fog_end = 6000;             // Dichter Nebel ab 6000 Quad
    camera.clip_far = 9000;              // Zeige keine Geometrie die weiter als 9000 Quad entfernt ist
}

// Nacht

function fog3() {
    fog_color = 2;
    camera.fog_start = 1500;
    camera.fog_end = 3000;
    camera.clip_far = 5000;
}

Es können unter File - MapProperies - Fog 5 verschiedene Nebel definiert werden, die über C-Script mit fog_color = 1..5 ausgewählt werden können.

Bei Umschaltung auf die Nacht-Himmelstextur muss also auch der Nebel und die Weitsicht entsprechend angepasst werden. Mit den Nebel- und Weitsichteinstellungen muss abhängig von der Levelgröße experimentiert werden. Insbesondere die Weitsichteinstellung (camera.clip_far) hat extreme Auswirkungen auf die Framerate.

 

Himmelstextur und Weitsicht

Besonders bei großen Außenleveln in denen die Weitsicht beschränkt werden muss ist die Beschaffenheit der Himmelstextur von großer Bedeutung.

Bild: Szene mit Blick in den Wald

       

Oben dargestellte Bilderserie zeigt den Blick in einen Wald. Mit den Tageinstellungen ist das Waldstück optimal sichtbar und es kann bis auf die begrenzenden Berge geblickt werden.

Der Wald soll jedoch dunkel und düster erscheinen. Dafür wird die Nebelfarbe auf Schwarz geändert. Die Weitsicht kann ebenfalls reduziert werden, da in der Dunkelheit kein so weiter Blick erforderlich ist.

Üblicherweise ist die Reduktion der Weitsicht auch notwendig um die Framerate innerhalb des Waldstückes halten zu können, da der Wald naturgemäß aus einer hohen Anzahl von Modellen besteht.

Bei reduzierter Weitsicht zeigt sich jetzt aber oben im mittleren Bild dargestelltes Phänomen. Die Bäume sind dunkel aber aufgrund der reduzierten Weitsicht werden die Berge nicht mehr dargestellt.

Hier scheint jetzt die Himmelstextur durch und ergibt ein völlig wiedersinniges Bild, dass eine weite freie Fläche nach den Bäumen vermuten lässt.

Auch hier kann mit der richtigen Himmelstextur das Problem wieder gelöst werden. Bei Verwendung einer Textur, deren Seitenflächen Schwarz sind wird das Bild trotz reduzierte Weitsicht als dichter dunkler Wald dargestellt.

 

Himmel nach unten holen

Oft wird am Horizont unter der Himmelstextur ein Übergang zum blauen Standardhimmel des WED dargestellt der unschön und störend ist. Deshalb ist es möglich den Himmel sowohl bei Cube als auch bei Dome noch über C-Script auszurichten.

 

Ausrichtung bei Dome

sky_clip = -180 ... 180    (Wert ist der Winkel des gezeichneten Bereiches)

Natürlich sollte nur so viel gezeichnet werden wie tatsächlich notwendig ist um keine Lücken zwischen den Bergen am Horizont und dem Himmel zu erhalten.

Ausrichtung bei Cube über den Parameter z

sky skybox6 {
    type = "skynachtalpha+6.tga";
    flags = cube, visible;
    z=-100;
}

Bei einem Skycube wird die Textur über den Parameter z beliebig nach oben oder unten verschoben.

Bild Himmel mit blau ausgefüllter Lücke

Himmel mit sky_clip=-45 und geschlossener Lücke