Anfang

 

2

 

Seit Version A5.520 gibt es ein neues Sky System mit Sky-Entities. Das alte mit der Skybox hat aber weiter Bestand. Ich bin nun auch auf das neue System umgestiegen. Obwohl etliche Parameter für die "alte" Skybox im neuen Handbuch nicht mehr aufgeführt sind kann darauf nicht verzichtet werden, weil sie vom neuen System benutzt wird den Himmel abzubilden. Es ist also nicht möglich komplett auf das neue System umzusteigen.

Damit die Kollisionserkennung und Darstellung des Levels richtig funktioniert muß das gesamte Level von einem hollow Block umschlossen sein. Dieser Block muß eine Textur bekommen die das "sky" Flag erhält. Da ich meinen eigentlichen sichtbaren Himmel mit einer Sky-Entity erstelle, spielt der Inhalt der Textur für den Sky-Block aber keine Rolle. Er wird nie sichtbar sein. Bei mir ist das eine blaue 64x64 Pixel große *.pcx Datei. Die Form des hollow Blockes spielt ebenso überhaupt keine Rolle, auch wenn das viele anders sehen. Es reicht also ein einfacher großer ausgehöhlter Quader der das Level umschliesst um den Traumhimmel zu realisieren.

Es gibt 2 verschiedene Sky-Entitys. Zum einen in Sky-Sprite, also ein Bild des Himmels oder Himmelskörpers zum anderen ein Sky-Modell, ein Modell des Himmels oder Himmelskörpers.

Oft habe ich im Forum Beispiele eines Sky-Modells gesehen, einer Kugel bei der die Himmelstextur innen aufgespannt war. Aber mir hat nie eines richtig gefallen. Meiner Meinung nach eignen sich die Sky-Modelle nur für Sternenhimmel oder als Modell für einen Himmelskörper. Den eigentlichen Himmel mit dahinziehenden Wolken würde ich mit Sky-Sprites erstellen. Soll eine Sonne oder Mond mit Aura e.t.c dargestellt werden ist wohl auch ein Sprite-Entity vorzuziehen, während Mond oder Planeten auch ganz gut als Sky-Modelle darstellbar sind. Ist bei dieser Sky-Entity das dome Flag gesetzt wird das Himmelsbild von der Engine auf eine imaginäre Himmelskuppel projiziert. Aus diesem Grunde erübrigen sich Kugel- oder Halbkugelmodelle. Sollten Modellkugeln benutzt werden um einen Levelhimmel zu erstellen, dann muß dieses Modell so groß skaliert werden das es im Radius mindestens so groß ist wie die Gesamtlänge des Levels. Außerdem sollten die Flächen der Kugel alle gleich groß sein. Dafür gibt es die sogenannte Geosphere. 3DStudio MAX stellt eine Reihe solcher Spheren zur Verfügung. Mit MED ist solch eine Kugel nicht machbar. Auf der Downloadseite habe ich ein paar solcher Kugeln mitsamt Mapping als "balls.exe" abgelegt.

 

Um eine Sky-Entity einzusetzen benötigt man ein Script. Dieses wird mit in die Start wdl (Die wdl mit der das Spiel startet) hineingeschrieben. Hier in diesem Beispiel ist zu sehen, das ich zwei Sky-Entities nach der function init_environment() hineingesetzt habe. In der init_environment() Funktion kann natürlich noch mehr stehen, aber hier steht nur sky_curve = 2;. Diese Variable verändert die Steigung aller Himmel die verwendet werden. Je größer die Zahl desto weiter zieht der Himmel in die Ferne. Ich wollte sie mit in die Sky-Entity Funktion einbinden, das gab bei mir aber eine Fehlermeldung. Wahrscheinlich weil es eine globale Variable ist.

 

function init_environment() {

.

.

.

sky_curve = 2;

.

.

.

}

Die Funktion init_environment() enthält alles rund um Himmel, Levelnebel, Terrain Detailmap,Clip_range

sky sky_globus {

"sky" definiert eine Sky-Entity, "sky_globus ist ein frei wählbarer Beispielname

               type = <himmel.pcx>;

hinter "type" kommt entweder ein Spritebild oder ein Modell für Himmelskörper oder Sternenkugel. Das Spritebild muß kachelbar sein und 2er Potenz haben

              speed_u = -6;

die Geschwindigkeit mit der der Himmel in X-Achse bewegt wird. Default = 1

              speed_v = 2;

die Geschwindigkeit mit der der Himmel in Y-Achse bewegt wird. Default = 1

              scale_x = 2;

die Skalierung der Himmelstextur

              flags = dome,visible;

das "dome" Flag bewirkt, das die Himmelstextur auf eine imaginäre Kugel gekachelt wird und zwar überall dort wo im Level eine Sky Textur einem Block zugewiesen wurde. Also auf der Skybox. Das "visible" Flag wird benötigt damit die Textur sichtbar ist.

              layer = 1;

die Sichtebene der Sky-Entity. Größere Layer verdecken niedrigere.

}

 

 

 

sky cloud_globus {

        type = <clouds.tga>;

        speed_u = 7;

        speed_v = -4;

        scale_x = 2;

        flags = dome,transparent,visible;

        layer = 2;

}

Das ist eine zweite Sky-Entity für eine Wolkenschicht die vor dem Basishimmel sky_globus erscheint. Deshalb ist der Layer = 2 gesetzt. Hier verwende ich ein TGA Bild mit Alphakanal. Das ergibt eine durchscheinende Wolkenschicht. Deshalb muß hier auch das "transparent" Flag gesetzt sein.

sky moon_sprite {

       type = <moon.tga>;

       flags = facing,transparent,visible;

       layer = 3;

       x = 0;

       y = 0;

       z = 2000;

}

Hier noch eine dritte Sky-Entity um ein Mondbild einzusetzen. Bei den Flags ist "facing" hinzugekommen, damit sich das Sprite immer zur Kamera dreht. "dome" und "scene" Flag dürfen hier nicht gesetzt sein. X,Y,Z geben die Koordinaten an an denen die Entity in den Levelhintergrund gezeichnet wird. Diese können in Funktionen z.B. um Tag/Nacht Zyklen zu erstellen verändert werden. Hier bei dieser "moon_sprite" Sky-Entity würde man das über moon_sprite.x, moon_sprite.y und moon_sprite.z tun. Sie könnten dann zur Sonnenposition (sun_pos) ins Verhältnis gesetzt und dadurch mit sun_angle.pan und sun_angle.tilt bewegt werden.

 

Es können natürlich noch mehr Sky-Entities erzeugt werden. Außerdem gibt es noch weitere Möglichkeiten den Himmel zu gestalten. Tag- und Nachtmodus u.s.w. Da ich das nicht benötige hier keine Erklärungen dazu. Werden mehrere zum Teil durchscheinende Sky-Entities erstellt sollte die Comercial Version vorhanden sein. Hier besteht die Möglichkeit mit der Variablen d3d_alphadepth = 32 die Alphakanalbilder mit voller Farbtiefe darzustellen.

 

Die Kugelprojektion des Himmels bewirkt eine Verzerrung in der Nähe des Horizontes. Diese kann bis jetzt noch nicht vermieden werden und muß, wenn sie stört, verdeckt werden. Das erreicht man mit einer weiteren Sky-Spriteentity, die aber das scene Flag anstatt dome erhält. Damit kann der verzerrte Himmel verdeckt werden.

Aber was tun wenn ein weit entfernter Horizont, der dazu noch ziemlich niedrig ist, realisiert werden soll? Ich benötige die Illusion eines weit entfernten Ufers.

 

2