Displacements in Hammer: Gelände bauen ohne typische Fehler
Displacements in Hammer erklärt: Gelände erstellen, Power wählen, Texturen blenden, Kanten vernähen und Risse, Leaks und Kollisionsfehler beheben.
Ein Displacement ist eine vierseitige Brush-Fläche, die Hammer in ein Dreiecksraster unterteilt und die du danach frei verformst. Du erzeugst es im Texturwerkzeug (Shift+A) im Reiter „Displacement“ mit „Create“, formst es mit „Paint Geometry“ und schließt Nachbarflächen mit „Sew“ aneinander. Die üblichen Probleme haben fast immer eine von drei Ursachen: Ein Displacement dichtet die Map nicht ab, es blockiert keine Sicht, und seine Kanten schließen nur unter bestimmten Bedingungen lückenlos an.
Was ein Displacement kann und was nicht
VBSP behandelt einen Brush mit Displacement anders als jeden anderen Brush: Er wird vollständig aus der Welt-Geometrie entfernt, und nur die verformte Fläche gelangt in die BSP.
| Eigenschaft | Verhalten | Folge |
|---|---|---|
| Map abdichten | nein | Führt Gelände nach außen, meldet VBSP **** leaked **** |
| Sicht blockieren | nein | VVIS rechnet durch jeden Hügel hindurch |
| Kollision | ja | Spieler, Props und Schüsse treffen die Fläche, pro Displacement abschaltbar |
| Beleuchtung | ja | Eigene Lightmaps, die Fläche wirft Schatten |
| An ein Entity binden | nein | VBSP bricht mit einem Fehler ab |
| Form der Grundfläche | nur vier Ecken | Flächen mit drei oder fünf Ecken lehnt VBSP ab |
Auch die übrigen Seiten des Brushes verschwinden beim Kompilieren, unabhängig von ihrer Textur. Unter und hinter jedes Gelände gehört deshalb ein einfacher World-Brush mit tools/toolsnodraw, der die Map abdichtet. Führt die rote Linie eines Leaks durch den Boden, fehlt er. Wie du die Stelle findest, beschreibt Map-Leak-Fehler beheben. Soll ein Hügel zwei Bereiche auch für die Sichtbarkeit trennen, braucht er einen Kern aus World-Brushes, siehe GMod-Map optimieren.
Displacement erstellen und die Power wählen
- Baue einen Brush, dessen Oberseite vier Ecken hat. Für größere Flächen setzt du mehrere Brushes nebeneinander, deren Kanten exakt aufeinanderliegen.
- Öffne das Texturwerkzeug mit
Shift+A(Tools → Texture Application) und wähle die Flächen aus, die zu Gelände werden sollen. - Wechsle in den Reiter „Displacement“, klicke auf „Create“ und gib die Power an.
Die Power bestimmt, wie fein die Fläche unterteilt wird. Erlaubt sind 2, 3 und 4.
| Power | Unterteilungen je Kante | Vertices | Dreiecke |
|---|---|---|---|
| 2 | 4 | 25 | 32 |
| 3 | 8 | 81 | 128 |
| 4 | 16 | 289 | 512 |
Power 4 kostet mehr als nur Dreiecke. Enthält eine Map auch nur ein einziges Displacement mit Power 4, speichert VBSP die Kollisionsdaten aller Displacements unkomprimiert und warnt:
WARNING: Map using power 4 displacements, terrain physics cannot be compressed, map will need additional memory and CPU.
In einem Test mit GMods VBSP belegten 120 Displacements mit Power 3 weniger als 10 KB Kollisionsdaten. Ein einziges zusätzliches mit Power 4 ließ den Physik-Bereich der BSP auf rund 1,8 MB wachsen, 42 Prozent des Maximums in der Auslastungstabelle. Bei 120 Displacements mit Power 4 stand dort SIZE OVERFLOW!!!. Ob eine solche Map noch lädt, haben wir nicht getestet. Nimm Power 3 als Normalfall und Power 2 für sanfte, große Flächen. Brauchst du mehr Auflösung, teile die Fläche in vier kleinere Brushes mit Power 3. Das ergibt dieselbe Dichte.
Formen und Texturen blenden
Die beiden wichtigsten Werkzeuge im Reiter „Displacement“:
- Paint Geometry: Der Dialog bietet die Effekte „Raise/Lower“, „Raise To“ und „Smooth“. „Axis“ legt die Richtung fest, „Distance“ die Stärke und „Radius“ die Größe des kugelförmigen Pinsels. Bei „Raise/Lower“ hebt die linke Maustaste an, die rechte senkt ab.
- Paint Alpha: Blendet zwischen zwei Texturen. Die linke Maustaste erhöht den Mischwert der Vertices, die rechte senkt ihn. „Invert Alpha“ kehrt die Werte der ausgewählten Displacements um, die beiden Texturen tauschen also die Plätze.
Paint Alpha wirkt nur mit einem Blend-Material. Es nutzt den Shader WorldVertexTransition mit zwei Texturen in $basetexture und $basetexture2, zum Beispiel nature/blendgrassgravel001a. Hammer speichert den Mischwert pro Vertex. Die Blende folgt also dem Raster: Ein Displacement mit Power 2 hat nur 5 mal 5 Punkte, schmale Wege lassen sich darauf nicht malen. Die Texturkoordinaten bleiben die der flachen Grundfläche. Ziehst du Punkte steil nach oben, wird die Textur dort gestreckt.
Nachbarn vernähen: wann Sew funktioniert
Jedes Displacement besitzt eigene Vertices entlang seiner Kante. Ein Riss entsteht, wenn die Vertices zweier Nachbarn an der gemeinsamen Kante nicht an derselben Position liegen. „Sew“ schiebt sie aufeinander. Ob das gelingt, hängt an drei Punkten:
- Beide Displacements sind ausgewählt. „Sew“ bearbeitet nur die Auswahl.
- Die Brush-Kanten liegen exakt aufeinander. Entweder haben beide Kanten dieselben Endpunkte, oder zwei halb so lange Kanten treffen sich genau in der Mitte der längeren. Andere Fälle kennen die Nachbarschaftsdaten der Engine nicht.
- Die Power darf verschieden sein. Laut dem Wiki der Valve Developer Community schiebt „Sew“ dann die Vertices des feineren Displacements auf die des gröberen. Die feinere Seite verliert an dieser Kante ihre zusätzlichen Details.
Plane die Aufteilung deshalb am Raster, bevor du Displacements erzeugst. Nach jedem Malen in Kantennähe vernähst du erneut. Laut demselben Wiki verbindet „Sew“ ein Displacement auch mit einer normalen Brush-Fläche, wenn beide Grundflächen eine Kante mit denselben Endpunkten teilen. Wo das nicht der Fall ist, führst du das Gelände ein Stück in die Wand hinein.
Typische Fehler und ihre Ursache
| Symptom | Ursache | Lösung |
|---|---|---|
| Riss zwischen zwei Displacements | Nach dem Formen nicht vernäht, oder die Brush-Kanten passen nicht aufeinander | Beide auswählen und „Sew“, sonst die Brushes anpassen |
**** leaked ****, Linie führt durch das Gelände | Displacement als Außengrenze | Soliden World-Brush mit tools/toolsnodraw darunter und dahinter setzen |
| Props fallen durch den Boden | „No Physics Collision“ ist aktiv | Häkchen im Reiter „Displacement“ entfernen |
| Spieler oder Schüsse gehen durch das Gelände | „No Hull Collision“ oder „No Ray Collision“ ist aktiv | Häkchen entfernen |
Drei Meldungen brechen den Compile ab:
Error: displacement found on a(n) func_detail entity - not supported (entity 3, brush 0)
Trying to create a non-quad displacement! (entity 0, brush 12)
ParseDispInfoChunk: nummapdispinfo > MAX_MAP_DISPINFO
Die erste erscheint, wenn ein Displacement-Brush an ein Entity gebunden ist. Markiere ihn und wähle Tools → Move to World (Ctrl+Shift+W). Die zweite betrifft eine Grundfläche ohne genau vier Ecken, die dritte zu viele Displacements. Das Source SDK 2013 setzt diese Grenze bei 2048. Für Garry's Mod nennt das Wiki der Valve Developer Community 16384, und ein Test mit GMods VBSP passt dazu: 2100 Displacements kompilierten ohne Meldung, der Abbruch kam erst oberhalb von 16384. Beide Werte stehen in der Übersicht der Map-Limits. Die Auslastungstabelle am Ende des Logs nennt für dispinfos kein Maximum und warnt deshalb nie mit VERY FULL!. Unklare Meldungen kannst du als Compile-Log im Map Scanner einfügen.
Wann ein Model oder Brushwork besser passt
- Brushwork: Ebene Böden, Straßen, Mauern und alles, was abdichten, die Sicht blockieren oder sich als Entity bewegen muss.
- Model: Felswände mit Überhang, Höhlendecken, Bögen und einzelne Felsbrocken. Ein Model bringt eine unverzerrte Texturierung mit und lässt sich als
prop_staticbeliebig oft wiederverwenden. Die Prop-Typen erklärt prop_static, prop_dynamic und prop_physics. - Displacement: Große, organische Bodenflächen mit weichen Texturübergängen und Schatten aus Lightmaps.
- 3D-Skybox: Gelände, das niemand betritt, gehört verkleinert in die 3D-Skybox.
Häufige Fragen
Müssen die anderen Seiten des Displacement-Brushes nodraw sein?
Für den Compile nicht, denn VBSP verwirft den gesamten Brush. Im Test ergab ein Brush mit texturierten Seiten dieselbe Zahl an Flächen wie einer mit tools/toolsnodraw. Nodraw ist trotzdem richtig, falls du das Displacement später mit „Destroy“ wieder entfernst.
Zählen Displacements zum Brush-Limit?
Nein. Der Brush eines Displacements taucht in der kompilierten Map nicht als Brush auf. Jedes Displacement belegt aber eine Fläche und zählt zur eigenen Displacement-Grenze.
Wie groß sollte ein einzelnes Displacement sein?
Entscheidend ist der Abstand der Vertices, also Kantenlänge geteilt durch die Unterteilungen. Ein Brush mit 512 Units Kantenlänge hat bei Power 3 alle 64 Units einen Punkt. Für eine Wiese genügt das, für einen schmalen Pfad brauchst du kleinere Brushes.