Estou trabalhando em um jogo estilo Worms e quero gerar um terreno proceduralmente. Eu já fiz muita geração de terreno usando ruído perlin, e foi isso que comecei a usar para este jogo. O único problema é que é muito simples e chato, me dando algumas colinas, mas não a complexidade que eu quero. Eu gostaria de ter características como cavernas e montanhas suspensas e não me importo de ilhas flutuantes e coisas do tipo. Algo assim, mas ainda mais louco seria bom:
Pensei em primeiro gerar o terreno usando o ruído perlin clássico e depois remover as peças para criar cavernas e o que não, mas estou tendo problemas para orientar a remoção dessas peças. Existem alternativas para gerar um terreno assim?
Respostas:
Eu sugiro que você comece com o ruído 2D Perlin. Algo assim:
Em seguida, aplique um limite na imagem, para obter várias ilhas isoladas, como mostrado aqui:
Eu escolhi um limite de 0,04, tudo acima do limite seria colorido em azul. O restante permanece preto. Depois disso, é hora de determinar quais "ilhas" manter e quais jogar fora.
Uma abordagem possível seria percorrer a imagem da esquerda para a direita em várias alturas e selecionar as "ilhas" que se cruzam, com uma certa probabilidade. Na figura de exemplo, a linha mais baixa tem uma probabilidade de 100%; portanto, todas as ilhas que cruzar serão selecionadas (preenchidas em branco). A segunda linha tem uma probabilidade de 50% e a linha superior tem uma probabilidade de 10%.
Depois de marcar suas ilhas dessa maneira, você pode fechar as lacunas no meio aplicando uma operação morfológica ( dilatar )
E há uma paisagem possível.
A "granularidade" do ruído determinará quão pequenos serão os detalhes em seu mundo. Portanto, provavelmente é melhor experimentar esses valores.
Também onde e com quais probabilidades suas "linhas de seleção" estão posicionadas, o resultado será muito diferente. Se você tiver uma linha próxima ao topo da imagem com alta probabilidade de "selecionar" uma ilha, poderá criar algum tipo de paisagem de caverna, etc.
fonte
24
parabaseX
ebaseY
, 1 oitava e eu escolhi emitir ruído em escala de cinza e desativar o "fractal". Em qual idioma você está implementando isso?Eu começaria com um ruído permanente, filtrado com cuidado. Você terminaria com algo como na figura anexada à pergunta, com ilhas flutuantes. Juste remove as ilhas flutuantes posteriormente usando um algoritmo de contagem como os discutidos aqui
fonte
Na verdade, eu implementei isso a partir da excelente resposta do bummzack.
Aqui estão as etapas que acabei com:
E este é um exemplo do resultado:
Eu escrevi um artigo detalhado sobre todo o processo aqui e o código (JavaScript) é de código aberto, confira se você quer algo pronto para usar;)
fonte