Fließendes Wasser

In diesem Tutorial wird erklärt wie realistisch fließendes Wasser in der Source Engine realisieren kann. Das beinhaltet sowohl die sich bewegende Textur, als auch das tatsächliche treiben des Spielers. Grundkenntnisse im Mapping und das Wissen wie man überhaupt Wasser baut werden vorausgesetzt. Das Tutorial ist auch für alle interessant, die sich schon einmal irgendwie mit Wasser befasst haben.

Im Beispiel fließt das Wasser durch ein Strömungsrondell, was man aus vielen Spassbädern ja kennt, um auch zu zeigen das es in verschiedene Richtungen fließen kann (und das immer noch gut aussieht).

Ich will auch kurz der Fairness wegen meinen Dank an PotKinRot aus dem thewall forum aussprechen, der mich auf die Idee mit dem trigger_push brachte. Alle feinheiten diesbezüglich und auch alles weitere entsprang jedoch meinem Geist ^^.

Umgebung

Zuerst einmal basteln wir das Rondell selbst, durch das das Wasser fließen soll. Mit ein wenig Brushworkkenntnis sollte das kein Problem darstellen:

FIXME Bild muss ersetzt werden.

Strömung

Danach kommen die trigger_pushes. Für jede Bewegungsrichtung die Objekte (in dem Fall der Spieler) eingehen soll, setzen wir je einen Block in unser Rondell, den wir mit der nodraw-textur belegen (soll ja unsichtbar sein) und danach mittels tie-to-entity zu einem trigger_push machen.

FIXME Bild muss ersetzt werden.

Ganz wichtig hierbei ist, das man jeweils 32 Units Abstand zwischen den einzelnen pushblöcken lässt.

Das kommt daher, das der Spieler 32 Units breit ist. Wäre der Abstand zwischen zwei pushblöcken geringer, würde der Spieler bei den Übergängen kurzzeitig in pushblöcken hängen, und einen Geschwindigkeitsschub bekommen, was im Spiel wie ein ruckeln wirkt.

Ausserdem kann er an diesen Übergängen nicht mehr zurückschwimmen.

Die 32 Units sind also wichtig für einen flüssigen Übergang.

Die für uns interessanten Optionen bei den trigger_pushes sind eigentlich nur die „push direction“ und der „Speed of push“.

Bei der push direction legen wir einfach bequem über das kleine „Kompass-tool“ die Himmelsrichtung fest in die der Spieler getrieben werden soll.

Der Speed gibt logischerweise die Geschwindigkeit wieder in der man getrieben wird. Ich habe hier 100 für meine Strömung gewählt. Ob das für eure Strömung auch passt müsst ihr ausprobieren.

FIXME Bild muss ersetzt werden.

Wasser

Wenn die pushtrigger gesetzt sind, muss natürlich der Wasserblock selbst gebaut werden (Block mit nodraw-textur, oberes face mit Wassertextur, water_lod_control und env_cubemap setzen… sollte bekannt sein).

Nun haben wir zwar eine Strömung im Wasser, aber die Wasseroberfläche ist glatt. Wir brauchen also eine Wassertextur die „fliesst“.

Dazu müssen wir eine vorhandene Wasser-materials-datei ein klein wenig editieren. klingt fies, ist aber einfacher als man denkt, und eröffnet einem viele möglichkeiten.

Für unsere Beispielzwecke habe ich mit gcfscape die Source materials geöffnet und aus hl2\materials\nature die water_canals03 extrahiert.

Folgendes steht dort:

"Water"
{
 "Water_DX60"
 {
  "$fallbackmaterial" "nature/water_canals03_dx70"
 }
 "Water_DX80"
 {
  "$refractamount" ".13"
 }
 "Water_DX81"
 {
  "$refractamount" ".13"
 }
 "$abovewater" 1
 "%compilewater" 1
 "$forceexpensive" 1
 "$reflectentities" 0
 "$envmap" "env_cubemap"
 "%tooltexture" "dev/water_normal"
 "$refracttexture" "_rt_WaterRefraction"
 "$refractamount" "4"
 "$refracttint" "[.68 .76 .76]"
 
 "$reflecttexture" "_rt_WaterReflection"
 "$reflectamount" "2.5"
 "$reflecttint" "[1 .95 .85]"
 
 "$scale" "[1 1]"
 
 "$bumpmap" "dev/water_dudv"
 "$normalmap" "dev/water_normal"
 
 "$surfaceprop" "water"
 "$bottommaterial" "nature/water_canals03_beneath"
 "$bumpframe" "0"
 
 "$fogenable" 1
 "$fogcolor" "{20 42 39}"
 "$fogstart" "0"
 "$fogend" "330"
 
 "Proxies"
 {
  "AnimatedTexture"
  {
   "animatedtexturevar" "$normalmap"
   "animatedtextureframenumvar" "$bumpframe"
   "animatedtextureframerate" 30.00
  }
 
  "TextureScroll"
  {
   "texturescrollvar" "$bumptransform"
   "texturescrollrate" .05
   "texturescrollangle" 45.00
  }
 
  "WaterLOD"
  {
  }
 }
}

Sieht erstmal gefährlich aus, ist aber halb so schlimm, weil Valve uns eigentlich schon alles mitgegeben hat, was wir für unsere Flusstextur brauchen. Unter dem Punkt TextureScroll können wir mittels „texturescrollrate“ die Fliessgeschwindigkeit der Textur festlegen. In unserem Beispiel habe ich das auf .9 gesetzt. Den Wert „texturescrollangle“ setzen wir auf 90.00. Das hat den Zweck das die Textur sich immer nach Norden bewegt, was später die Einstellungen im Hammer erleichtern werden.

Nach dem editieren sollten wir die vmt natürlich noch umbenennen, damit die sich nicht mit der original canals.vmt beisst.

In diesem Beispiel habe ich sie Wassertest genannt.

Alle die sich nicht weiter für Wassertexturen interessieren, können diesen Abschnitt nun überspringen. Alle anderen: jetzt wirds interessant.

Bei meiner Suche nach den Wasser *vmt´s, fiel mir auf das es zwar viele vmt´s gibt, aber keine einzige vmf, was mich verwunderte, da die vmf´s ja die eigentliche Textur beinhalten. Auch in den Texturverweisen in den vmt´s selbst, stehen entweder nur verweise auf andere vmt´s, oder immerwieder ein und der selbe Verweis auf eine vmf.

Das bedeuted nichts anderes, als das es nur eine einzige Wassertextur gibt, die durch die verschiedenen vmt´s immer wieder anders definiert wird. Und genau das eröffnet einem einen riesenhaufen an möglichkeiten.

Im folgenden gehe ich mal auf die interessanten Punkte ein:

„$refracttint“ ist wahrscheinlich das interessanteste, denn über die folgenden drei Werte legt man die Farbe des Wassers fest. Die werte müssen zwischen 0 und 1 liegen, und sind nichts anderes als RGB farbwerte. 0 entspricht hierbei 0, und 1 entspricht 255, also der vollen Farbgebung. Will ich mein Wasser also in Marineblau, was in RGB etwa 0, 128, 255 entspräche, würde ich hier 0 .5 1 eintragen. Schnappt euch nen Farbeditor und probierts aus, es klappt.

„$refractamount“ legt fest wie stark verzerrt die Dinge erscheinen, die sich unter wasser befinden.

„$reflectamount“ legt fest wie stark das Wasser reflektieren soll

„$reflecttint“ bestimmt in welchen Farben Dinge reflektiert werden. Die Farbdefinition funktioniert wie bei $refracttint. Hier würde ich allerdings nicht allzuviel herumspielen, da es natürlich sehr schnell unrealistisch aussehen kann.

Die „fog“-einstellungen sind noch interessant um das Wasser besonders trübe oder besonders klar erscheinen zu lassen.

„$fogcolor“ legt hierbei fest in welche Farbe die trübe Sicht übergehen soll, wenn man nichts mehr sieht.

„$fogstart“ und „$fogend“ hingegen legen quasi fest wie klar das Wasser sein soll. Will man beispielsweise ein sehr klares Wasser, sollte der fog erst nach ein paar hundert Units einsetzen, und entsprechend später enden.

Da man fast alles was das Wasser betrifft in der vmt festlegt, und immer die selbe Grundtextur verwendet wird, kann man sich ein dutzend verschieden farbiger Wasserbecken in seiner Map bauen, und der Texturspeicher wird keinen Byte grösser. Auch die Map selbst wird kaum grösser, weil der Spieler sich ja keine neuen Texturen herunterladen muss.

Nun aber zurück zu unserem Rondell. Wir belegen den gebauten Wasserblock nun mit unserer Wassertest-textur, haben aber immernoch das Problem das nun der gesamte Block nach Norden „fliesst“, was für ein Rondell denkbar unpassend wäre.

Wir zerschneiden unseren Wasserblock nun also in passende Stücke, um den faces jeweils eine eigene Fliessrichtung zuordnen zu können.

FIXME Bild muss ersetzt werden.

Danach bearbeiten wir die einzelnen Wasserfaces mit dem Face-edit-tool.

Hier müssen wir nun die Rotation entsprechend der gewünschten Fliessbewegung anpassen.

Da wir ja vorhin festgelegt haben das unser Wasser naturgmäß nach Norden fliesst, ist eine Rotation von 0° also Norden. 90° wäre Westen, 180° ist Süden und 270° ist Osten. Mit diesem Wissen sind wir in der Lage unser Wasserface korrekt auszurichten.

FIXME Bild muss ersetzt werden.

Wenn alle Faces bearbeitet sind, und auch die pushblöcke richtig gesetzt sind, sollten wir ein schönes funktionierendes Wasserrondell mit echter Fliessbewegung fertiggestellt haben.

Falls ihr experimentierfreudig wart, habt ihr jetzt vllt auch blutrotes Wasser, das seine Umgebung in lila wiederspiegelt oder sonstwie schicke Effekte.

Ich hoffe das Tut hat euch gefallen/geholfen, und konnte das Mysterium Wasser ein klein wenig lüften.

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/fliessendes_wasser.txt · Zuletzt geändert: 2011/05/25 11:45 von Adrian_Broher