↓
iaen.es Diario de desarrollo Read in English

Gotic · 3 min de lectura

Lluvia, tormentas y arcoíris en Godot 4 (y por qué no se veía ni una gota)

Chaparrones que van y vienen, relámpagos y un arcoíris al escampar. La primera lluvia no se veía: el motor descartaba el emisor entero. Así lo arreglé con CPUParticles3D.

#shaders#mundo#godot#mods#fallos

Lluvia, tormentas y arcoíris en Godot 4 (y por qué no se veía ni una gota)

Con el mod Tiempo, en Gotic ya no hace siempre bueno. Pasa un buen rato despejado y luego el cielo se nubla, empieza a llover (a veces con tormenta, relámpagos y truenos) y escampa. Si escampa de día, sale el arcoíris un rato, como en la portada sobre Brumacosta. De noche lloviendo no hay estrellas.

La lluvia no es solo decorado: riega la granja, calla a los pájaros y a los grillos del sonido ambiente y esconde a las mariposas. Y ninguno de esos mods conoce a este.

La misma calle de Brumacosta en plena tormenta
Tormenta: cielo gris, menos sol y rayitas de lluvia

Cómo está hecho

El tiempo es una pequeña máquina de cuatro fases: despejado, nublándose, lloviendo y escampando. Las duraciones son constantes: 5 a 11 minutos despejado (6 la primera vez, para que una partida nueva empiece con sol), 40 s nublándose, de 1,5 a 3 minutos de lluvia (tormenta en 3 de cada 10), 30 s escampando y 70 s de arcoíris. Simulado con el azar de cada partida, salen unos 32 chaparrones en 6 horas de juego, lloviendo entre el 19 y el 21 % del tiempo.

El mod no pinta el cielo: le dice a Scenery cuánto está nublado y cuánto llueve (set_weather), y Scenery lo aplica encima de la hora del mod de día y noche. Cubierto, el cielo tira a gris, el sol baja al 35 %, las sombras se suavizan y la niebla se acerca. Además, world.scenery.rain queda a la vista de cualquier mod, como ya pasaba con la noche: así la granja riega sin saber quién hace llover.

La lluvia son 700 rayitas en un anillo de 4 a 12 m alrededor de la cámara, que cae desde 10 m por encima de ella. Un relámpago son dos destellos muy cortos (la luz ambiente y la del sol a tope) y, entre 0,6 y 2,6 s después, el trueno. El arcoíris son siete bandas en semicírculo hechas con MeshBuilder, colocadas a 380 m al otro lado del sol y sin niebla.

Lo que salió mal

Casi todo lo destaparon las capturas, no las pruebas:

  • No se veía ni una gota. La caja de dibujo de un CPUParticles3D mide cero, y con el emisor 10 m por encima de la cámara, fuera de la vista, el motor lo descartaba entero. La lección que me quedó: si algo no aparece, mira cuántos objetos dibuja la captura; si no sube, el motor ni lo intenta. La solución es un margen:
# Su caja de dibujo mide cero: con el emisor 10 m por encima de la cámara, fuera de la vista, se descartaba
# entera y no se veía ni una gota. Con margen, se dibuja mientras alguna pueda caer delante.
drops.extra_cull_margin = DROP_AREA * 2.0
  • Gotas invisibles. Las primeras medían 2 cm de ancho y a 10 m no llegaban a un píxel. Ahora miden algo más de 3 cm, y son opacas: lo transparente se pierde contra el mar.
  • Las gotas daban sombra. Se apagó.
  • De noche la lluvia brillaba. Las gotas no reciben luz, así que de noche se veían como neón. Ahora se oscurecen con la hora.
  • Estrellas detrás de las nubes. El cielo cubierto no tapaba la cúpula de estrellas. Ahora se apagan con lo nublado.

Para cada enganche hice que fallara a propósito y comprobé que alguna prueba lo veía: la granja sin regar, las estrellas tras las nubes, las gotas sin margen, el cielo sin nubes, el tiempo corriendo con el menú abierto, y mariposas y pájaros con lluvia. La suite quedó en 1005 comprobaciones correctas.

Lo que falta por comprobar

El coste en el móvil: 700 partículas calculadas por la CPU no se han medido en un teléfono. El sonido de la lluvia y del trueno se genera por código y no se ha escuchado. Y la lluvia atraviesa los tejados, porque las casas no tienen interiores.

Más de Gotic →