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!!
fonte
Respostas:
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.
fonte
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.
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.
fonte