Renderizar rios em uma grade


8

Criei um mapa aleatório de altura e agora quero criar rios. Eu criei um algoritmo baseado em * para fazer os rios fluírem dos picos para o mar e agora estou tentando descobrir um algoritmo elegante para renderizá-los.

É um mapgrid 2D, quadrado e quadrado. As células que o rio cola possui um valor inteiro simples com esta forma: rivernumber && pointOrder. Ou seja: 10, 11, 12, 13, 14, 15, 16 ... 1 + N para o primeiro rio, 20,21,22,23 ... 2 + N para o segundo, etc. Isso é criado no mapear o tempo de geração da grade e é executado apenas uma vez, quando o mundo é gerado.

Eu queria tratar cada rio como um vetor, mas há um problema: se o mesmo rio tiver galhos (porque coloquei algum ruído para gerar galhos), não posso simplesmente conectar os pontos em ordem.

A segunda alternativa é gerar um algoritmo complexo onde analisa cada ponto, verifica se o próximo não é um ramo, se assim for, aciona outro algoritmo que cuida do ramo e retorna ao rio principal, etc. Muito complexo e deselegante.

Talvez exista uma solução no algoritmo de geração mundial ou no algoritmo de renderização de rio que é comumente usada nesses casos e que eu não conheço.

Alguma dica? Obrigado!!


Eu acho que você pode usar alguns algoritmos usados ​​para geração de labirinto e apenas cortar alguns egdes para criar um mapa do rio mais realista.
Ali1S232

11
Eu tenho o caminho do rio, mas não sei como lidar com galhos ao renderizá-los, conectando pontos.
Gabriel A. Zorrilla

Tem um ponto na confluência (ponto de encontro de dois rios) que é tratado como um tipo especial de nó?
The Duck comunista

11
Uma vez vi um artigo sobre como criar estradas em um mapa de blocos. Ele selecionou blocos com base nos quais blocos vizinhos também possuem propriedades de estrada. criou algo em torno de 16 peças diferentes (incluindo todas as rotações). essa etapa foi realizada apenas durante a geração da cena. não sei se você poderia fazer a mesma coisa ou não.
Ali1S232

4
Você pode nos dar uma captura de tela com alguns esboços para mostrar melhor o que você está tentando fazer?
AttackingHobo

Respostas:


1

Este tutorial / game dev blog fornece um excelente método para gerar rios, e eles são renderizados muito bem. Não tenho certeza se isso pode ser aplicado efetivamente em sua situação, pois você adotou uma abordagem diferente (e possui um mapa baseado em grade), mas vale a pena investigar, com certeza.


Isso é muito legal.
91111 Tim Holt

11
Mais detalhes que podem ser úteis: Os rios nesse projeto fluem das montanhas para os oceanos. O volume aumenta à medida que flui ladeira abaixo, e os rios que se juntam adicionam seus volumes. A largura da linha no mapa é o sqrt do volume. Toda localização no rio aponta ladeira abaixo; uma bifurcação no rio significa que dois ou mais locais apontam para o mesmo local em declive. Eu acho que isso poderia ser usado em uma grade também.
Amitp

0

Uma coisa que você pode fazer é fazer com que cada nó individual se auto-identifique. Faça uma passagem sobre ele após a geração, mas antes de exibir, e dê a cada quadrado do rio uma lista de entradas (número mais baixo, mesmo rio) e saídas (número mais alto, mesmo rio).

A partir desses dados, você deve descobrir onde estão as entradas e saídas (o armazenamento da localização relativa provavelmente ajudaria) e a partir daí pode renderizar o rio dessa praça com base nas conexões. A maneira mais simples de fazer uma ramificação é conectar as entradas / saídas ao centro da praça.

A representação gráfica disso pode ser adotada de várias maneiras diferentes, e você não forneceu informações suficientes sobre o seu uso para recomendar uma diretamente; então, apenas mencionarei uma maneira que envolve um sistema de partículas em que cada segmento de água flui dinamicamente "ladeira abaixo".

Faça com que o quadrado da raiz inicie um número de "pedaços de água" em cada uma das entradas e peça que eles decidam aleatoriamente a partir das saídas disponíveis na criação. Quando atingir a saída, solte um na entrada da peça e retorne o pedaço de água ao início da praça. Como ele já apareceu no próximo quadrado (faça isso apenas uma vez por peça em um quadrado) e você já conhece as configurações e os cálculos (não faça a randomização novamente), você pode deixar essa peça girar no quadrado com muito pouco cálculo e, se você quiser, provavelmente usando um sombreador.

Isso tem a vantagem de deixar seus rios irem para rios menores após as ramificações, e os dois rios resultantes não precisam ter o mesmo tamanho. Levará um momento para que o rio seja preenchido totalmente de cima para baixo, mas o efeito resultante deve ser bastante agradável, pois você pode acabar com algo assim simplesmente com base em quais nós têm rios.

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

Também, dependendo da semente e do código, teria o potencial de parecer diferente cada vez que você a executasse, mesmo que a localização do nó fosse a mesma.

Espero que este exemplo esteja em algum lugar ao longo das linhas que você está procurando.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.