Como remover um terreno flutuante quando gerado com o 3D Perlin Noise?

10

Atualmente, estou usando o 3D Perlin Noise para gerar terrenos aleatórios em combinação com os Marching Cubes.

Meu problema parece estar no dimensionamento da função de ruído para obter alturas razoáveis ​​no meu terreno. Se apenas uma oitava for usada, todos os pontos em relação ao ruído serão obviamente interpolados, resultando em dados razoavelmente suaves. No entanto, para obter saliências / cavernas / terrenos irregulares, tenho que usar várias oitavas com amplitudes variadas e / ou escalar os valores resultantes para a minha altura 'máxima' desejada no mapa.

Talvez esteja faltando alguma coisa, mas, usando cubos de marchas com ruído 3D perlin, recebo regularmente pedaços de terreno flutuantes.

Alguma idéia de como eu poderia corrigir isso ou se houver outras funções de ruído que eu possa usar para obter resultados como estou descrevendo? Estou querendo colinas / vales / montanhas / lagos / etc. Não há necessidade de bits flutuantes segregados do restante do mapa. Acredito que esse seja um problema semelhante ao que o Minecraft tem quando tem um terreno que apenas flutua no céu ocasionalmente após a geração.

Obrigado por qualquer ajuda, Mythics

Mythics
fonte

Respostas:

9

Provavelmente, a única maneira de se livrar completamente de terrenos flutuantes é testando a conectividade. Dependendo do tamanho do seu mapa, isso pode ser uma opção. Você pode fazer isso escolhendo o ponto base, como o fundo do seu mundo. Em seguida, verifique se todos os seus voxels são:

  1. Conectado à base.
  2. Conectado a um voxel conectado à base.

Provavelmente, começar em um ponto conectado conhecido (como o fundo do seu mundo) e, em seguida, percorrer uma amplitude de voxels conectados funcionaria muito bem. Verifique se você está sinalizando voxels como conectados enquanto viaja. Você pode fazer isso por pedaço.

Além disso, existem maneiras mais baratas de minimizar, mas não remover completamente o terreno flutuante.

  • Viés de gradiente : você pode influenciar o posicionamento de voxels sólidos com um gradiente. A função de gradiente diminuiria de maneira acentuada depois que você estivesse acima do "nível do solo". Este artigo fala sobre o uso de um gradiente e tem outras dicas interessantes.

  • Ruído do mapa de altura : você pode gerar ruído como um mapa de altura. Isso removeria as saliências e cavernas, mas você pode simular aquelas com uma camada de ruído subtrativa adicional.

  • Menos ruído ruidoso : use menos oitavas no ruído do terreno e gere ruído subtrativo para obter projeções e cavernas.

MichaelHouse
fonte
O terreno só pode ser conectado através do bloco adjacente se for uma saliência a partir daí.
Loren Pechtel
@ Loren: Mas está perfeitamente bem. Contanto que o mecanismo permita abordar os pedaços pelo índice completo, ele funcionará sem problemas.
Phil
@LorenPechtel Eu digo que você pode fazê-lo por pedaço, mas você precisa verificar os pedaços adjacentes quando estiver à beira de um pedaço. Isso pode se tornar um problema ao gerar um novo terreno e não gerar o pedaço adjacente. Quando você chega a essa situação em que possui um potencial terreno flutuante, pode gerar o pedaço adjacente ou usar o algoritmo de ruído para analisar os voxels até encontrar "base" ou uma conexão conhecida ao pedaço atual.
MichaelHouse
0

pode ser tarde demais para responder, mas eu estava começando agora com essa coisa de geração de terrenos voxel, com Perlin Noise e encontrei uma maneira de criar o terreno sem essas peças flutuantes. Eu acho que isso pode ajudá-lo. Portanto, para criar o terreno, primeiro gere um mapa de altura do que li os pixels desse mapa de altura. Agora vem a parte interessante, eu li o valor "brilho" (na verdade, é a escala de cinza) de cada pixel naquele mapa de altura e isso me dá a altura para essa parte específica do mapa, e para criar o terreno, presumo que esse mapa de altura seja meu terreno visto de cima, por isso, se o valor da escala de cinza de um pixel (depois de ser ajustado ao meu terreno "maxHeight") nesse mapa de altura for, digamos 30, isso significa que, naquele ponto específico do meu terreno, gerarei apenas 30 voxels no eixo y e isso me dará um terreno sem partes flutuantes. Se você quiser cavernas e assim por diante, poderá aplicar outro ruído no original (sob a superfície) para criar essas cavernas. Espero que funcione para voce.

Sammael
fonte
1
Eu acredito que isso é semelhante ao segundo ponto da minha resposta acima?
MichaelHouse