Mapping et Hammer

Displacements dans Hammer : du terrain sans les erreurs habituelles

Les displacements dans Hammer expliqués : créer du terrain, choisir le Power, mélanger les textures, coudre les bords, corriger fissures, leaks et collisions.

Un displacement est une face de brush à quatre côtés que Hammer subdivise en une grille de triangles et que tu déformes ensuite librement. Tu le crées dans l’outil de texture (Shift+A), dans l’onglet « Displacement », avec « Create », tu le modèles avec « Paint Geometry » et tu raccordes les faces voisines avec « Sew ». Les problèmes habituels ont presque toujours l’une de ces trois causes : un displacement ne rend pas la map étanche, il ne bloque pas la visibilité, et ses bords ne se raccordent sans interstice que sous certaines conditions.

Ce qu’un displacement sait faire et ce qu’il ne sait pas faire

VBSP traite un brush portant un displacement différemment de tout autre brush : il est entièrement retiré de la géométrie du monde, et seule la face déformée se retrouve dans le BSP.

PropriétéComportementConséquence
Rendre la map étanchenonSi le terrain mène vers l’extérieur, VBSP signale **** leaked ****
Bloquer la visibiliténonVVIS calcule à travers chaque colline
CollisionouiLes joueurs, les props et les balles touchent la surface, désactivable pour chaque displacement
ÉclairageouiSes propres lightmaps, la surface projette des ombres
Lier à une entiténonVBSP s’arrête avec une erreur
Forme de la face de basequatre coins uniquementVBSP refuse les faces à trois ou cinq coins

Les autres côtés du brush disparaissent eux aussi à la compilation, quelle que soit la texture qu’ils portent. C’est pourquoi chaque portion de terrain a besoin, en dessous et derrière elle, d’un world brush simple en tools/toolsnodraw qui rend la map étanche. Si la ligne rouge d’un leak traverse le sol, c’est ce brush qui manque. L’article corriger l’erreur de leak d’une map explique comment trouver l’endroit. Si une colline doit aussi séparer deux zones pour la visibilité, il lui faut un noyau de world brushes, voir optimiser les performances d’une map GMod.

Créer un displacement et choisir le Power

  1. Construis un brush dont la face supérieure a quatre coins. Pour les surfaces plus grandes, place côte à côte plusieurs brushes dont les arêtes coïncident exactement.
  2. Ouvre l’outil de texture avec Shift+A (Tools → Texture Application) et sélectionne les faces qui doivent devenir du terrain.
  3. Passe à l’onglet « Displacement », clique sur « Create » et saisis le Power.

Le Power détermine la finesse avec laquelle la face est subdivisée. Les valeurs autorisées sont 2, 3 et 4.

PowerSubdivisions par arêteVerticesTriangles
242532
3881128
416289512

Le Power 4 ne coûte pas que des triangles. Si une map contient un seul displacement en Power 4, VBSP enregistre les données de collision de tous les displacements sans compression et avertit :

WARNING: Map using power 4 displacements, terrain physics cannot be compressed, map will need additional memory and CPU.

Lors d’un test avec le VBSP de GMod, 120 displacements en Power 3 occupaient moins de 10 Ko de données de collision. Un seul displacement supplémentaire en Power 4 a fait grossir la section physique du BSP à environ 1,8 Mo, soit 42 % du maximum dans le tableau d’utilisation. Avec 120 displacements en Power 4, le tableau affichait SIZE OVERFLOW!!!. Nous n’avons pas testé si une telle map se charge encore. Prends le Power 3 comme choix normal et le Power 2 pour les grandes surfaces aux formes douces. S’il te faut plus de résolution, divise la face en quatre brushes plus petits en Power 3. Tu obtiens la même densité.

Modeler et mélanger les textures

Les deux outils les plus importants de l’onglet « Displacement » :

  • Paint Geometry : la boîte de dialogue propose les effets « Raise/Lower », « Raise To » et « Smooth ». « Axis » fixe la direction, « Distance » l’intensité et « Radius » la taille de la sphère de peinture. Avec « Raise/Lower », le bouton gauche de la souris relève et le droit abaisse.
  • Paint Alpha : fait le mélange entre deux textures. Le bouton gauche de la souris augmente la valeur de mélange des vertices, le droit la diminue. « Invert Alpha » inverse les valeurs des displacements sélectionnés, les deux textures échangent donc leur place.

Paint Alpha ne fonctionne qu’avec un matériau de blend. Celui-ci utilise le shader WorldVertexTransition avec deux textures dans $basetexture et $basetexture2, par exemple nature/blendgrassgravel001a. Hammer enregistre la valeur de mélange par vertex. Le mélange suit donc la grille : un displacement en Power 2 n’a que 5 points sur 5, on ne peut donc pas y peindre de chemins étroits. Les coordonnées de texture restent celles de la face de base plane. Si tu tires des points en pente raide vers le haut, la texture s’étire à cet endroit.

Coudre les voisins : quand Sew fonctionne

Chaque displacement possède ses propres vertices le long de son bord. Une fissure apparaît quand les vertices de deux voisins ne sont pas à la même position sur le bord commun. « Sew » les déplace les uns sur les autres. Trois points décident si cela fonctionne :

  • Les deux displacements sont sélectionnés. « Sew » n’agit que sur la sélection.
  • Les arêtes des brushes coïncident exactement. Soit les deux arêtes ont les mêmes extrémités, soit deux arêtes moitié moins longues se rejoignent exactement au milieu de la plus longue. Les données de voisinage du moteur ne connaissent aucun autre cas.
  • Le Power peut être différent. D’après le wiki de la Valve Developer Community, « Sew » déplace alors les vertices du displacement le plus fin sur ceux du plus grossier. Le côté le plus fin perd ses détails supplémentaires le long de ce bord.

Planifie donc le découpage sur la grille avant de créer des displacements. Chaque fois que tu peins près d’un bord, couds de nouveau. D’après le même wiki, « Sew » raccorde aussi un displacement à une face de brush normale si les deux faces de base partagent une arête avec les mêmes extrémités. Là où ce n’est pas le cas, fais entrer le terrain un peu dans le mur.

Erreurs typiques et leur cause

SymptômeCauseSolution
Fissure entre deux displacementsPas cousus après le modelage, ou les arêtes des brushes ne coïncident pasSélectionner les deux et « Sew », sinon ajuster les brushes
**** leaked ****, la ligne traverse le terrainDisplacement utilisé comme limite extérieurePlacer un world brush solide en tools/toolsnodraw en dessous et derrière
Les props tombent à travers le solLa case « No Physics Collision » est cochéeDécocher la case dans l’onglet « Displacement »
Les joueurs ou les balles traversent le terrainLa case « No Hull Collision » ou « No Ray Collision » est cochéeDécocher la case

Trois messages interrompent la compilation :

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

Le premier apparaît quand un brush de displacement est lié à une entité. Sélectionne-le et choisis Tools → Move to World (Ctrl+Shift+W). Le deuxième concerne une face de base qui n’a pas exactement quatre coins, le troisième un trop grand nombre de displacements. Le Source SDK 2013 fixe cette limite à 2048. Pour Garry’s Mod, le wiki de la Valve Developer Community indique 16384, et un test avec le VBSP de GMod concorde : 2100 displacements ont compilé sans message, et l’arrêt n’est survenu qu’au-dessus de 16384. Les deux valeurs figurent dans la vue d’ensemble des limites des maps Source. Le tableau d’utilisation à la fin du log n’indique aucun maximum pour dispinfos et n’avertit donc jamais avec VERY FULL!. Tu peux coller les messages peu clairs, sous forme de compile log, dans le Map Scanner.

Quand un modèle ou du brushwork convient mieux

  • Brushwork : sols plats, routes, murs et tout ce qui doit rendre la map étanche, bloquer la visibilité ou se déplacer en tant qu’entité.
  • Modèle : falaises en surplomb, plafonds de grotte, arches et rochers isolés. Un modèle apporte un texturage sans déformation et peut être réutilisé en prop_static autant de fois que tu veux. Les types de props sont expliqués dans prop_static, prop_dynamic et prop_physics.
  • Displacement : grandes surfaces de sol organiques, avec des transitions de texture douces et des ombres issues des lightmaps.
  • Skybox 3D : le terrain sur lequel personne ne marche jamais a sa place, à échelle réduite, dans la skybox 3D.

Questions fréquentes

Les autres côtés du brush de displacement doivent-ils être en nodraw ?

Pas pour la compilation, car VBSP écarte le brush entier. Dans le test, un brush aux côtés texturés a produit le même nombre de faces qu’un brush en tools/toolsnodraw. Le nodraw reste quand même le bon choix au cas où tu retirerais plus tard le displacement avec « Destroy ».

Les displacements comptent-ils dans la limite de brushes ?

Non. Le brush d’un displacement n’apparaît pas comme brush dans la map compilée. Chaque displacement occupe en revanche une face et compte dans la limite distincte des displacements.

Quelle taille devrait avoir un seul displacement ?

Ce qui compte, c’est l’espacement des vertices : la longueur d’arête divisée par le nombre de subdivisions. Un brush de 512 unités de long a un point toutes les 64 unités en Power 3. C’est suffisant pour une prairie, mais un chemin étroit demande des brushes plus petits.