Gras

Es gibt grundsätzlich zwei verschiedene Möglichkeiten, Gras zu erstellen. Man kann es entweder mit einem prop_detail oder prop_static manuell setzen, wenn man einzelne Grashalme in der Karte haben will. Möchte man allerdings auf einer bestimmte Fläche (→ Material) Gras stehen haben, benutzt man lieber Detail-Prop-Gruppen. Das sind prop_details oder Sprites die im Spiel automatisch verteilt werden und in einer Textdatei namens detail.vbsp festgelegt sind. Diese Datei beinhaltet alle wichtigen Informationen für die Erstellung von Gras auf Texturen.

Erstellen und Einbinden

Einem Material kann auf folgende Weise einen Detail-Prop-Gruppe zugeordnet werden, wodurch automatisch prop_details/Sprites auf diesem erstellt werden. Dazu muss im .vmt des Materials diese Zeile hinzugefügt werden:

%detailtype = "<detail-prop-gruppenname>"

Dabei steht <detail-prop-gruppenname> für eine Detail-Prop-Gruppe aus der detail.vbsp, z.B. swamp_grass_and_rocks. In der SourceSDK-Anleitung von Valve-ERC befindet sich folgendes Beispiel:

swamp_grass_and_rocks
{
    "density" "800.0"

    Group1 
    { 
        "alpha" "1.0" 

        Model1
        {
            "model" "models/junk/rock1.mdl"
            "amount" "0.3"
        }

        Model2
        {
            "model" "models/junk/rock2.mdl"
            "amount" "0.3"
        }
    }
      
    Group2 
    {
        "alpha" "0.0"

        Model1 
        { 
            "model" "models/foliage/Grass_tuft_003a.mdl"
            "amount" "0.1"
        }

        Model2
        {
            "model" "models/foliage/Grass_tuft_004b.mdl"
            "amount" "0.3"
        }
    }
}

Density legt die Dichte der prop_details auf dem Material fest. Je größer die Density, um so mehr werden zufällig erstellt.

Detail-Prop-Gruppen haben Untergruppen, hier z.B. Group1 und Group2. Normale Materialien benötigen nur eine Untergruppe. Displacements die mit Blendtexturen belegt sind, können zwei Gruppen verwenden.

Detail-Gruppen mit Models: Jede Untergruppen beinhaltet ein oder mehrere Model-Felder, diese geben an, welche Models als prop_detail benutzt werden. Amount gibt an, wieviele Models dieses Typs verwendet werden sollten. 0.3 bedeutet z.B. 30% sollen von diesem Typ sein.

Die Angabe Alpha wird nur für Displacements verwendet. Wenn zwei Texturen geblendet werden, beschreibt der Alphawert wieviel von jeder Textur verwendet werden soll. Je nachdem wie dieser Wert ausfällt, wird eine bestimmte Untergruppen benutzt.

Ein Beispiel: Auf einem Displacement liegt ein Blend-Matrial, die eine Textur ist eine Strasse (Alpha = 1.0 → 100% Strasse) und die andere ist Gras (Alpha = 0.0 → 100% Gras). Mit der oben angegebene detail.vbsp würden dann Steinchen auf der Strasse liegen und Grasbüschel auf dem Gras stehen, da die Untergruppe mit „alpha“ „1.0“ Models von Steinchen beinhaltet und die Untergruppe mit „alpha“ „0.0“ Models von Grasbüscheln beinhaltet. Man kann auch noch mehr Untergruppen verwenden, z.B. eine Untergruppen mit „alpha“ „0.5“, diese würden dann bei 50% Strasse und 50% Gras verwendet werden.

Sprites und ihre Eigenschaften

Neben *.mdl's kann man auch Sprites verwenden. Diese benötigen bis zu 10mal weniger Rechenzeit als normale Models. Deshalb sollte die Verwendung von Sprites auf Flächen die dicht bewachsen sind bevorzugt werden. Hier ist ein Beispiel für die Benutzung von Sprites:

    Group1
    {
        "alpha" "1.0"

        Model1
        {
            "sprite" "288 0 128 128 512" 
            "spritesize" "0.5 0.0 19 25"
            "spriterandomscale" "0.2"
            "amount" "0.2"
            "detailOrientation" "2"
        }
        Model2
        {
            "sprite" "0 0 128 128 512"
            "spritesize" "0.5 0.0 23 30"
            "spriterandomscale" "0.2"
            "amount" "0.1"
            "detailOrientation" "2"
        }
    }

Die Texturen diese Sprites müssen alle aus Unterregionen des Materials detailsprite.vtf stammen. Man kann allerdings auch eine eigene Sprite-datei verwenden. Dieses muss man dann im Hammer unter den Mapoptionen einstellen. Für das Beispiel gehen wir von der Standart-detailsprite aus.

Die ersten beiden Zahlen in der sprite-Zeile geben die Position (x,y) der oberen linken Ecke des Sprite an, an der es in der detailsprite.vtf liegt. Die nächsten beiden Zahlen geben die Breite und Höhe des Sprites an. Die letzte Zahl gibt die Größe der detailsprite.vtf in Pixeln an, hier bei ist die Breite als auch die Höhe gemeint, d.h. detailsprite.vtf ist 512px hoch und 512px breit.

Die ersten beiden Zahlen in der spritesize-Zeile geben den Origin des Sprites an, wobei (0,0) links unten und (1,1) rechts oben ist. Die letzten beiden Zahlen geben die Grösse an, mit der das Sprite im Spiel dargestellt werden soll. Im Beispiel hat das Sprite seinen Origin unten in der Mitte und ist 23px breit und 30px hoch.

Spriterandomscale bestimmt den Faktor, um den sich die Größe des Sprites im Spiel zufällig ändert (im Beispiel oben: 0,2 → von 80% bis 120% variiert die Größe)

Zum Schluss fehlt noch das DetailOrientation, welches die Bewegungsart des Sprites angibt. 0 bedeutet es rotiert nicht mit, wenn der Spieler herumgeht, 1 bedeutet dass es immer direkt „in die Kamera“ schaut. 2 bedeutet dass es sich nur auf der Z-Achse bewegt.

Sprite-Effekte seit EP1

Seit EP1 können Sprites jetzt noch ein paar zusätzliche Effekte bekommen die den flachen Busch optisch ordentlich verbessern. Sprites können jetzt auch trianguliert bzw. gekreuzt dargestellt werden. Ein paar Effekte anhand eines Beispieles:

Model3
{
	"sprite_shape" "tri"
	"sprite" "768 256 256 128 1024" 
        "spritesize" "0.5 0.0 64 32"
        "spriterandomscale" "0.2"
        "amount" "0.1"
        "detailOrientation" "0"
	"shape_angle" "25"
	"shape_size" "0.025"
	"sway" "1.0"
}

„Sprite_shape“ „tri“ sorgt dafür das das Sprite nicht einmal abgebildet wird, sondern dreimal und zwar im 120° zueinander gedreht. „Sprite_shape“ „cross“ würde dafür Sorgen, dass das Sprite zweimal im 180° Winkel zueinander abgebildet wird. Mittels „shape_angle“ kann man definieren in welchem Winkel die einzelnen Sprites von der aufrechten Position abweichen. „0“ würde jedes Sprite ganz aufrecht stehen lassen, während „90“ das Sprite flache auf dem Boden liegen lassen würde. Mit einem Wert von 70-80 wird auch das Farnsprite auf einmal nützlich. „shape_size“ definiert inwiefern sich die einzelnen Sprites eines „Sprite_shape“ „tri“ voneinander in der Grösse unterscheiden. Werte von 0-1 sind erlaubt. Zum Schluss kommen wir noch zum Sahnehäubchen, dem „Sway“. Das hinzufügen von „sway“ „1.0“ erlaubt es unserem Sprite sich zu bewegen wenn jemand es im Spiel überläuft. Erwartet jedoch keine Farcry2 Effekte, bei sehr flachen Sprites wirkt es manchmal ein wenig verzerrt. Hier gilt: Probieren geht über studieren. Man kann die Stärke des „Sway“&#180;s übrigens im Spiel mit dem Befehl „cl_detail_max_sway“ einstellen. Standart wäre 5.

Die Detailsprite.vtf

Hier die Daten der einzelnen Sprites aus der Original CSS-detailsprite.vtf, wobei die ersten beiden Werte die Position darstellen und die letzten beiden die Größe des Sprites. Die detailsprite.vtf ist 1024 x 1024 Pixel groß, also müsste die Zeile für Gras 5 beispielsweise so lauten:

"sprite" "0 256 256 192 1024"

detailsprite.jpg

1) Gras                   "sprite" "0 0 256 256 1024"
2) Gras                   "sprite" "256 0 256 256 1024"
3) Gras                   "sprite" "0 256 256 256 1024"
4) Gras                   "sprite" "256 256 256 256 1024"
5) Gras                   "sprite" "0 576 256 192 1024"
6) Gras                   "sprite" "256 576 256 192 1024"
7) Blumenstrauch          "sprite" "512 0 256 256 1024"
8) Farn                   "sprite" "768 0 256 256 1024"
9) Hohes Strauchgras      "sprite" "512 256 128 256 1024"
10) Gras                  "sprite" "640 256 128 128 1024"
11) Gras                  "sprite" "640 384 128 124 1024"
12) Flacher breiter Busch "sprite" "768 256 256 128 1024"
13) Hohes Unkraut         "sprite" "512 512 220 256 1024"
14) Breitblättriger Busch "sprite" "732 512 292 256 1024"
15) Wassergräser          "sprite" "688 768 128 256 1024"
16) Wassergräser          "sprite" "824 768 200 256 1024"
Die Verwendung aller Dokumente einschließlich der Abbildungen ausschließlich zu nichtkommerziellen Zwecken. Verbreitung des Dokuments auf Speichermedien, (insbesondere auf CD-ROMs als Beilage zu Zeitschriften und Magazinen oder sog. "Mission-Packs" etc.) ist untersagt.
 
half-life_2/tutorials/gras.txt · Zuletzt geändert: 2011/05/24 09:17 von Adrian_Broher