Mapping & Hammer

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.

EigenschaftVerhaltenFolge
Map abdichtenneinFührt Gelände nach außen, meldet VBSP **** leaked ****
Sicht blockierenneinVVIS rechnet durch jeden Hügel hindurch
KollisionjaSpieler, Props und Schüsse treffen die Fläche, pro Displacement abschaltbar
BeleuchtungjaEigene Lightmaps, die Fläche wirft Schatten
An ein Entity bindenneinVBSP bricht mit einem Fehler ab
Form der Grundflächenur vier EckenFlä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

  1. Baue einen Brush, dessen Oberseite vier Ecken hat. Für größere Flächen setzt du mehrere Brushes nebeneinander, deren Kanten exakt aufeinanderliegen.
  2. Öffne das Texturwerkzeug mit Shift+A (Tools → Texture Application) und wähle die Flächen aus, die zu Gelände werden sollen.
  3. 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.

PowerUnterteilungen je KanteVerticesDreiecke
242532
3881128
416289512

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

SymptomUrsacheLösung
Riss zwischen zwei DisplacementsNach dem Formen nicht vernäht, oder die Brush-Kanten passen nicht aufeinanderBeide auswählen und „Sew“, sonst die Brushes anpassen
**** leaked ****, Linie führt durch das GeländeDisplacement als AußengrenzeSoliden World-Brush mit tools/toolsnodraw darunter und dahinter setzen
Props fallen durch den Boden„No Physics Collision“ ist aktivHäkchen im Reiter „Displacement“ entfernen
Spieler oder Schüsse gehen durch das Gelände„No Hull Collision“ oder „No Ray Collision“ ist aktivHä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_static beliebig 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.