Renderizar ríos en una cuadrícula

8

He creado un mapa de altura aleatorio y ahora quiero crear ríos. He creado un algoritmo basado en un * para hacer que los ríos fluyan de los picos al mar y ahora estoy en la búsqueda de encontrar un algoritmo elegante para representarlos.

Es una cuadrícula 2D cuadrada. Las celdas que pasa el río tienen un valor entero simple con esta forma: rivernumber && pointOrder. Es decir: 10, 11, 12, 13, 14, 15, 16 ... 1 + N para el primer río, 20,21,22,23 ... 2 + N para el segundo, etc. Esto se crea en el mapea el tiempo de generación de la cuadrícula y se ejecuta solo una vez, cuando se genera el mundo.

Quería tratar cada río como un vector, pero hay un problema, si el mismo río tiene ramas (porque pongo algo de ruido para generar ramas), no puedo simplemente conectar los puntos en orden.

La segunda alternativa es generar un algoritmo complejo donde analice cada punto, verifique si el siguiente no es una rama, si es así, active otro algoritmo que se encargue de la rama y luego regrese al río principal, etc. Muy complejo e poco elegante.

Quizás haya una solución en el algoritmo de generación mundial o en el algoritmo de representación de río que se usa comúnmente en estos casos y que no conozco.

¿Algun consejo? ¡¡Gracias!!

Gabriel A. Zorrilla
fuente
Supongo que podría usar algunos algoritmos utilizados para la generación de laberintos y simplemente cortar algunos egdes para crear un mapa de río más realista.
Ali1S232
1
Tengo el camino del río, pero no sé cómo manejar las ramas cuando las renderizo, conectando puntos.
Gabriel A. Zorrilla
¿Tiene un punto en la confluencia (punto de encuentro de dos ríos) que se trata como un tipo especial de nodo?
El pato comunista
1
Una vez vi un artículo sobre cómo crear carreteras en un mapa de mosaico. Seleccionó mosaicos en función de qué mosaicos vecinos también tienen propiedades de carretera. creó algo alrededor de 16 mosaicos diferentes (incluidas todas las rotaciones). Este paso se realizó solo durante la generación de la escena. No sé si podrías hacer lo mismo o no.
Ali1S232
44
¿Puede darnos una captura de pantalla con algunos bocetos para mostrar mejor lo que está tratando de hacer?
AttackingHobo

Respuestas:

1

Este tutorial / blog de desarrollo de juegos proporciona un método excelente para generar ríos, y se renderizan muy bien. No estoy seguro de si esto se puede aplicar de manera efectiva en su situación, ya que ha adoptado un enfoque diferente (y tiene un mapa basado en la cuadrícula), pero vale la pena analizarlo, seguro.

dlras2
fuente
Eso es muy agradable.
Tim Holt
1
Más detalles que pueden ser útiles: los ríos en ese proyecto fluyen de las montañas a los océanos. El volumen aumenta a medida que fluye cuesta abajo, y los ríos que se unen agregan sus volúmenes. El ancho de línea en el mapa es el sqrt del volumen. Cada lugar en el río apunta cuesta abajo; una bifurcación en el río significa que dos o más ubicaciones apuntan al mismo lugar cuesta abajo. Creo que esto también podría usarse en una cuadrícula.
amitp
0

Una cosa que podría hacer es hacer que cada nodo individual se maneje solo. Haga un pase sobre él cuando después de la generación pero antes de mostrar y dé a cada cuadrado del río una lista de entradas (número más bajo, mismo río) y salidas (número más alto, mismo río).

A partir de estos datos, deberías poder averiguar dónde están las entradas y las salidas (almacenar la ubicación relativa probablemente ayudaría) y desde allí puedes representar el río de ese cuadrado en función de las conexiones. La forma más sencilla de hacer una rama es conectar las entradas / salidas al centro de la plaza.

La representación gráfica de esto podría tomarse de muchas maneras diferentes, y usted no ha brindado suficiente información sobre su uso como para recomendarla directamente; así que solo mencionaré una forma que involucra un sistema de partículas donde cada segmento de agua fluye dinámicamente "cuesta abajo".

Haga que el cuadrado raíz comience un número de "piezas de agua" en cada una de sus entradas y haga que decidan al azar de las salidas disponibles en la creación. Cuando llegue a la salida, engendra uno en la baldosa que golpeó la entrada y devuelve la pieza de agua al comienzo de su cuadrado. Como ya se ha generado en el siguiente cuadrado (solo haga esto una vez por pieza en un cuadrado), y ya conoce la configuración y los cálculos (no vuelva a aleatorizar), puede dejar que esta pieza se repita en su cuadrado con muy poco cálculo, y si lo desea, probablemente utilizando un sombreador.

Esto tiene la ventaja de dejar que sus ríos vayan a ríos más pequeños después de las ramas, y los dos ríos resultantes no tienen que ser del mismo tamaño. El río tardará un momento en completarse de arriba a abajo, pero el efecto resultante debería ser bastante agradable, ya que podría terminar con algo como esto simplemente en función de los nodos que tienen ríos.

10--10--6--6--2--2
    |      |     
    4--4   4
       |   |
       4---6--6--6
       |  
       2

También, dependiendo de la semilla y el código, podría tener un aspecto diferente cada vez que lo ejecutara, incluso si la ubicación del nodo fuera la misma.

Espero que este ejemplo esté en algún lugar en la línea que estás buscando.

Lunin
fuente