Displacements en Hammer: crea terreno sin los errores de siempre
Displacements en Hammer explicados: crear terreno, elegir el Power, mezclar texturas, coser bordes y arreglar grietas, leaks y problemas de colisión.
Un displacement es una cara de brush de cuatro lados que Hammer subdivide en una rejilla de triángulos y que después deformas libremente. Lo creas en la herramienta de texturas (Shift+A), en la pestaña «Displacement», con «Create», le das forma con «Paint Geometry» y unes las caras vecinas con «Sew». Los problemas habituales casi siempre tienen una de estas tres causas: un displacement no sella el mapa, no bloquea la visibilidad y sus bordes solo encajan sin huecos en determinadas condiciones.
Qué puede hacer un displacement y qué no
VBSP trata un brush con displacement de forma distinta a cualquier otro brush: lo elimina por completo de la geometría del mundo, y solo la cara deformada acaba en el BSP.
| Propiedad | Comportamiento | Consecuencia |
|---|---|---|
| Sellar el mapa | no | Si el terreno da al exterior, VBSP informa de **** leaked **** |
| Bloquear la visibilidad | no | VVIS calcula a través de cada colina |
| Colisión | sí | Jugadores, props y balas chocan con la superficie; se puede desactivar por displacement |
| Iluminación | sí | Lightmaps propios, la superficie proyecta sombras |
| Ligarlo a una entity | no | VBSP aborta con un error |
| Forma de la cara base | solo cuatro esquinas | VBSP rechaza las caras con tres o cinco esquinas |
Los demás lados del brush también desaparecen al compilar, lleven la textura que lleven. Por eso todo tramo de terreno necesita debajo y detrás un world brush sencillo con tools/toolsnodraw que selle el mapa. Si la línea roja de un leak atraviesa el suelo, falta ese brush. Cómo encontrar el punto se explica en solucionar el error de leak del mapa. Si una colina también debe separar dos zonas a efectos de visibilidad, necesita un núcleo de world brushes; consulta optimizar el rendimiento de un mapa de GMod.
Crear un displacement y elegir el Power
- Construye un brush cuya cara superior tenga cuatro esquinas. Para superficies más grandes, coloca uno junto a otro varios brushes cuyas aristas coincidan exactamente.
- Abre la herramienta de texturas con
Shift+A(Tools → Texture Application) y selecciona las caras que deban convertirse en terreno. - Cambia a la pestaña «Displacement», haz clic en «Create» e introduce el Power.
El Power determina con qué finura se subdivide la cara. Los valores permitidos son 2, 3 y 4.
| Power | Subdivisiones por arista | Vértices | Triángulos |
|---|---|---|---|
| 2 | 4 | 25 | 32 |
| 3 | 8 | 81 | 128 |
| 4 | 16 | 289 | 512 |
El Power 4 cuesta algo más que triángulos. Si un mapa contiene un solo displacement con Power 4, VBSP guarda sin comprimir los datos de colisión de todos los displacements y avisa:
WARNING: Map using power 4 displacements, terrain physics cannot be compressed, map will need additional memory and CPU.
En una prueba con el VBSP de GMod, 120 displacements con Power 3 ocuparon menos de 10 KB de datos de colisión. Uno solo más con Power 4 hizo crecer la sección de física del BSP hasta unos 1,8 MB, el 42 % del máximo en la tabla de uso. Con 120 displacements con Power 4, la tabla mostraba SIZE OVERFLOW!!!. No probamos si un mapa así todavía carga. Usa Power 3 como opción normal y Power 2 para superficies grandes y suaves. Si necesitas más resolución, divide la cara en cuatro brushes más pequeños con Power 3. Eso da la misma densidad.
Dar forma y mezclar texturas
Las dos herramientas más importantes de la pestaña «Displacement»:
- Paint Geometry: El diálogo ofrece los efectos «Raise/Lower», «Raise To» y «Smooth». «Axis» fija la dirección, «Distance» la intensidad y «Radius» el tamaño de la esfera de pintado. Con «Raise/Lower», el botón izquierdo del ratón sube y el derecho baja.
- Paint Alpha: Hace la mezcla entre dos texturas. El botón izquierdo del ratón sube el valor de mezcla de los vértices y el derecho lo baja. «Invert Alpha» invierte los valores de los displacements seleccionados, de modo que las dos texturas intercambian su sitio.
Paint Alpha solo funciona con un material de blend. Este usa el shader WorldVertexTransition con dos texturas en $basetexture y $basetexture2, por ejemplo nature/blendgrassgravel001a. Hammer guarda el valor de mezcla por vértice. Por tanto, la mezcla sigue la rejilla: un displacement con Power 2 solo tiene 5 por 5 puntos, así que en él no se pueden pintar caminos estrechos. Las coordenadas de textura siguen siendo las de la cara base plana. Si tiras de los puntos hacia arriba con mucha pendiente, la textura se estira ahí.
Coser vecinos: cuándo funciona Sew
Cada displacement tiene sus propios vértices a lo largo de su borde. Aparece una grieta cuando los vértices de dos vecinos no están en la misma posición en el borde compartido. «Sew» los mueve hasta hacerlos coincidir. Que funcione depende de tres puntos:
- Los dos displacements están seleccionados. «Sew» solo actúa sobre la selección.
- Las aristas de los brushes coinciden exactamente. O bien las dos aristas tienen los mismos extremos, o bien dos aristas de la mitad de longitud se encuentran justo en el punto medio de la más larga. Los datos de vecindad del motor no contemplan ningún otro caso.
- El Power puede ser distinto. Según la wiki de Valve Developer Community, «Sew» mueve entonces los vértices del displacement más fino sobre los del más grueso. El lado más fino pierde su detalle adicional a lo largo de ese borde.
Así que planifica la distribución sobre la rejilla antes de crear displacements. Cada vez que pintes cerca de un borde, vuelve a coser. Según la misma wiki, «Sew» también une un displacement a una cara de brush normal si las dos caras base comparten una arista con los mismos extremos. Donde no sea así, mete el terreno un poco dentro de la pared.
Errores típicos y su causa
| Síntoma | Causa | Solución |
|---|---|---|
| Grieta entre dos displacements | No se cosieron después de darles forma, o las aristas de los brushes no coinciden | Selecciona los dos y usa «Sew»; si no, ajusta los brushes |
**** leaked ****, la línea atraviesa el terreno | Displacement usado como límite exterior | Pon debajo y detrás un world brush sólido con tools/toolsnodraw |
| Los props caen a través del suelo | La casilla «No Physics Collision» está marcada | Desmarca la casilla en la pestaña «Displacement» |
| Los jugadores o las balas atraviesan el terreno | La casilla «No Hull Collision» o «No Ray Collision» está marcada | Desmarca la casilla |
Tres mensajes abortan la compilación:
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
El primero aparece cuando un brush de displacement está ligado a una entity. Selecciónalo y elige Tools → Move to World (Ctrl+Shift+W). El segundo se refiere a una cara base que no tiene exactamente cuatro esquinas, y el tercero a demasiados displacements. Source SDK 2013 fija este límite en 2048. Para Garry's Mod, la wiki de Valve Developer Community indica 16384, y una prueba con el VBSP de GMod encaja: 2100 displacements compilaron sin ningún mensaje, y la compilación solo se abortó por encima de 16384. Los dos valores están en el resumen de límites de los mapas en Source. La tabla de uso del final del log no indica ningún máximo para dispinfos y por eso nunca avisa con VERY FULL!. Los mensajes que no entiendas puedes pegarlos como compile log en el Map Scanner.
Cuándo encaja mejor un modelo o el brushwork
- Brushwork: Suelos planos, carreteras, muros y todo lo que tenga que sellar, bloquear la visibilidad o moverse como entity.
- Modelo: Acantilados con salientes, techos de cuevas, arcos y rocas sueltas. Un modelo trae un texturizado sin distorsión y se puede reutilizar como
prop_statictantas veces como quieras. Los tipos de prop se explican en prop_static, prop_dynamic y prop_physics. - Displacement: Superficies de suelo grandes y orgánicas, con transiciones de textura suaves y sombras de lightmaps.
- Skybox 3D: El terreno que nadie pisa nunca va, reducido de escala, en el skybox 3D.
Preguntas frecuentes
¿Los demás lados del brush del displacement tienen que ser nodraw?
Para la compilación no, porque VBSP descarta el brush entero. En la prueba, un brush con los lados texturizados produjo el mismo número de caras que uno con tools/toolsnodraw. Aun así, nodraw es lo correcto por si más adelante quitas el displacement con «Destroy».
¿Los displacements cuentan para el límite de brushes?
No. El brush de un displacement no aparece como brush en el mapa compilado. Eso sí, cada displacement ocupa una cara y cuenta para el límite aparte de displacements.
¿Qué tamaño debería tener un solo displacement?
Lo que importa es la separación entre vértices: la longitud de la arista dividida entre las subdivisiones. Un brush de 512 unidades de largo tiene un punto cada 64 unidades con Power 3. Eso basta para un prado, pero un camino estrecho necesita brushes más pequeños.