Como gerar cavernas que se assemelham às do Minecraft?

34

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: insira a descrição da imagem aqui

Mythics
fonte
5
Dê uma olhada aqui e role para baixo.
22712 William Hillary William
Há uma edição da revista de desenvolvedores de jogos nos últimos 24 meses que discute profundamente como fazer o que você está tentando fazer. Eu acessaria o site deles.
Joey Green
@ JoeyGreen Qual é o nome da revista? Ou você tem um link para o site deles?
jumpnett
11
Chama-se revista de desenvolvedores de jogos. gdmag.com . Você pode obter uma assinatura e obter versões em pdf da revista nos últimos 10 anos ou mais. Se você se inscrever, existe uma maneira de pesquisar problemas anteriores e encontrar o problema desejado.
Joey Green

Respostas:

30

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".

Visão em primeira pessoa do sistema de cavernas Gnomescroll 1

Sistema de Cavernas Gnomescroll Visão em Primeira Pessoa 2

Sistema de cavernas Gnomescroll - terceira pessoa vista 2

Estes são os libnoise "Perlin Worms" do tutorial libnoise. A técnica reproduz de perto as cavernas geradas no Minecraft.

Linoise Tutorial Perlin Worms

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.

HaltingState
fonte
3
Você pode adicionar algumas informações ou recursos para aprender sobre essa coisa de "perlin worms"?
David Gouveia
11
Este é um tutorial sobre "perlin worms" libnoise.sourceforge.net/examples/worms/index.html
HaltingState
Não é necessário, mas se você puder elaborar esse último parágrafo, eu agradeceria muito. Para gerar um worm, eu assumiria que você precisaria de um ponto de partida por worm, que precisaria estar dentro de N blocos de qualquer jogador em que N seja o tamanho máximo de um worm.
Mitos
3
Exatamente. Cada verme tem um ponto de partida e é encerrado se vagar fora de um determinado raio do pedaço. Existe um gerador de números aleatórios que gera deterministicamente uma sequência de números pseudo-aleatórios, que é uma função das coordenadas do bloco. Esses números aleatórios determinam onde e quantos worms se originam nesse nó. Worms também podem se ramificar. A carga computacional diminui se os worms forem mais "locais" e não puderem se aventurar mais do que um pequeno raio de pedaço.
HaltingState
Talvez não exatamente o que eu queria ouvir, mas o que eu estava esperando. Mais uma vez obrigado HaltingState. :)
Mitos
7

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).

Gavan Woolery
fonte
Posso não entender exatamente o que você quer dizer com isso, mas como eu faria isso rapidamente enquanto o mundo gera?
Mitos
Uma maneira possível é gerar a árvore de abrangência mínima dentro de cada bloco separadamente e, em seguida, conectar cada bloco encontrando os dois nós mais próximos entre os dois blocos. Depois que um pedaço é preenchido com seu algoritmo de terreno padrão, você pode escavá-lo em torno da árvore de abrangência mínima.
Gavan Woolery
11
outra solução (mais fácil), embora menos eficiente e provavelmente "mais barulhenta", é usar o movimento browniano para abrir um caminho (como uma formiga cavando aleatoriamente).
Gavan Woolery
2

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.

quantumpotato
fonte
Eles mostram as imagens para cada etapa (função) e mostram variações
quantumpotato
1

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.

Llamageddon
fonte
-5

aqui está

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;

Locklan Smith
fonte