Estou trabalhando em um mundo processual 3D há um tempo e estou querendo começar a adicionar sistemas de cavernas. Atualmente, estou usando 2D / 3D Perlin Noise para a geração de terrenos em combinação com Marching Cubes para terrenos mais suaves. Eu só estou ficando perplexo quando se trata de longas cavernas interconectadas.
Espero conseguir algo mais parecido com os sistemas de cavernas do Minecraft. Eles parecem estar muito conectados, ramificam-se aleatoriamente em praticamente qualquer direção, e quase qualquer ponto da caverna teria uma aparência bastante circular com um raio bastante igual por toda parte (não é a melhor expressão, mas não tem muita certeza de como colocá-la) .
O maior desafio para gerar cavernas como eu estou querendo é que eu quero gerar o mundo em tempo real. O mundo é gerado pedaço por pedaço atualmente, começando onde o jogador está e gera a partir daí. Eu NÃO gostaria de gerar nada no mundo e depois cavar as cavernas usando um padrão errante, autômatos celulares, etc.
Existem algoritmos conhecidos que podem ser usados para isso? Se assim for, alguém quer compartilhar como eles fazem algo semelhante? Eu aprecio muito qualquer ajuda.
Um bom exemplo:
fonte
Respostas:
As cavernas do Minecraft são geradas pelo método "perlin worms". O gerador serpenteia pelo terreno e abre um túnel. O Minecraft não usa ruído perlin 3D para geração de cavernas, porque tende a deixar bolsos não conectados no terreno. As cavernas de Minecraft não são geradas pelo ruído 3d Perlin desde as versões Alpha muito antigas.
Aqui estão cavernas em Gnomescroll geradas a partir do método "perlin worm".
Estes são os libnoise "Perlin Worms" do tutorial libnoise. A técnica reproduz de perto as cavernas geradas no Minecraft.
Os parâmetros de serpente afetam a qualidade do sistema de cavernas e determinam a vertical das cavernas e a rapidez com que elas mudam de direção. Cavernas no ramo de minecraft e o raio do túnel da caverna varia ao longo do comprimento das cavernas.
O Minecraft gera as cavernas em pedaços. A abordagem necessária é complicada e ninguém ainda conseguiu fazer a engenharia reversa do gerador de cavernas do Minecraft, apesar do interesse dos modders de servidor.
A abordagem mais provável gera as cavernas serpenteantes, pedaço por pedaço, à medida que o mapa infinito é gerado e se expande. As cavernas no pedaço atual são funções das sementes da caverna nos pedaços N mais próximos para alguns N. Usando um gerador de números aleatórios que é uma função das coordenadas do pedaço para semear as cavernas, é possível calcular as cavernas no pedaço atual para um número mapa infinito enquanto avalia apenas os pedaços dentro de um raio finito.
fonte
Eu geraria uma nuvem de pontos dentro de áreas onde o terreno é sólido - você pode experimentar diferentes densidades. Então eu usaria um algoritmo como uma árvore de abrangência mínima para conectar todos os pontos - isso garantirá que todas as áreas sejam alcançáveis. Em seguida, basta desenhar grandes áreas ocas (compostas por ar) de nó para nó (ou seja, uma linha grossa de voxels).
fonte
A edição de abril de 2011 da Game Developer Magazine entra em detalhes sobre isso com as funções interativas de ruído Perlin - consulte o artigo Creator of Worlds a partir da página 21.
fonte
Use uma função de ruído para atribuir valores para cada pedaço para determinar se ele tem túneis ou não e use-os para decidir onde colocar cavernas. Se você deseja túneis, basta usar mais funções de ruído (com sementes diferentes) e usar seus valores para determinar se existem túneis. Depois disso, use as funções comuns de "desenho" para criar os túneis. Para tornar tudo mais realista, use mais ruído para fazer o deslocamento aleatório dos pontos de origem das referidas cavernas / túneis.
Se você não quiser usar várias funções de ruído, poderá tentar a distâncias maiores - por exemplo, em vez de fazer ruído3d (2,2,2) para chunk em (2,2,2) fazer ruído3d (2,2, 16) e use (2,2,16) para um valor, (2,2,17) para o segundo valor, etc .... então apenas ajuste sua frequência de acordo para tornar todos os valores independentes ou correlacionados em escalas curtas.
Para variar a densidade da caverna em todo o mundo, use outra função de menor frequência que influenciará esses valores.
Caso isso resulte em cavernas confusas, basta aumentar a distância dos referidos pontos interconectados ou ajustar o algoritmo.
Não tenho certeza se o Minecraft faz cavernas como essa (embora eu ache que sim), mas essa solução deve produzir resultados satisfatórios.
fonte
Embora a maioria das cavernas, como as acima, use o worm Perlin , algumas pessoas preferem fazê-lo manualmente. Dessa forma, eles podem fazer do jeito que querem exatamente bloco por bloco. Uma caverna feita com o worm Perlin pode ser imprecisa e só pode fazer com que a caverna tenha um metro e meio de altura e um metro e meio de largura; isso pode ser impreciso;
fonte