Planetas procedurais, mapas de altura e texturas

19

Atualmente, estou trabalhando em um gerador de planeta processual OpenGL. Espero usá-lo para um RPG espacial, que não permitirá que os jogadores desçam à superfície de um planeta, então eu ignorei qualquer coisa relacionada ao ROAM. No momento, estou desenhando um cubo com VBOs e mapeando uma esfera.

Eu estou familiarizado com a maioria das técnicas de geração de mapas de altura fractal e já implementei minha própria versão do deslocamento do ponto médio (não é útil neste caso, eu sei).

Minha pergunta é: qual é a melhor maneira de gerar proceduralmente o mapa de altura. Eu observei o libnoise, que me permite criar mapas / texturas de altura inclináveis, mas até onde eu posso ver, eu precisaria gerar uma rede como essa .

Deixando a telha óbvia.

Alguém poderia me aconselhar sobre o melhor caminho a seguir?

Qualquer entrada seria muito apreciada.

henryprescott
fonte

Respostas:

18

Primeiro de tudo, não sei por que você deseja implementar um mapa de altura (ou seja, deslocamento da geometria) se as pessoas não conseguirem pousar, apenas parece mais eficiente mapear normalmente ou algo assim.

Com isso dito, o que você deseja é converter de uma arbitrária (x, y, z)para uma (u, v)coordenada, o que é trivial. Nenhum mapa cúbico necessário.

texto alternativo

texto alternativo

  1. Todo (u, v)texel tem uma altura (heightmap RGB = height) e uma posição (x, y, z) = pos.
  2. Encontre e normalize a posição NORMAL(x, y, z) = N.
  3. Novo vértice = pos+N*height.

Isso funcionará melhor com um mosaico mais alto. Use também o libnoisemapeamento esférico adequado para o seu mapa de altura, que será algo assim (mas preto e branco):

texto alternativo

David Titarenco
fonte
1

O mapeamento da altura do deslocamento do ponto médio é um bom ponto de partida. OP, por que você acha que não é?

O OP é bom para modelar a superfície do planeta como um mapa cúbico, porque qualquer mapa plano (por exemplo, projeção de Mercator) terá distorções feias e complicadas, em termos matemáticos.

Se eu fosse OP, esqueceria a geometria do planeta em grande escala a princípio. Eu faria um mapa de cubo em que cada face é 2 ** N + 1 pixels (2,3,5,9,17,33 ...) e cada texel codifica uma altura [0..N) em que 0 é a altitude de a vala mais baixa esperada e N é a altitude da montanha mais alta esperada do planeta.

Eu calculava alturas aleatórias para os oito vértices do cubo e as propagava para os seis quadrados do mapa do cubo, para que cada vértice apareça três vezes.

Ao gerar recursivamente alturas fractais para os pontos médios das arestas, certifique-se de propagar os vértices da aresta da face para a outra face que os compartilha.

Quando terminar, tenho um mapa de cubo em que todos os texels de borda são dobrados e todos os texels de canto são triplicados. Não há necessidade de convertê-lo em um mapa normal - eu usaria o algoritmo no artigo de Morten Mikkelsen para renderizar normais diretamente do mapa de altura em tempo de execução.

Em tempo de execução, eu provavelmente renderizaria um quad que cubra a projeção do planeta na tela e faria um único teste de interseção de esfera de raio no shader de pixel para descobrir se eu atingi o planeta e onde. Certamente é melhor rasterizar um modelo de esfera altamente pavimentado e obtém uma boa borda suave também.

bmcnett
fonte
1

O ruído de deslocamento do ponto médio, com o deslocamento máximo dimensionado pela longitude absoluta do pixel, pode produzir um mapa de ruído esférico rapidamente. Tabelas de cores com altitude, inclinação e luz solar ou longitude como parâmetros podem ser usadas para sombrear o planeta automaticamente.

bjk
fonte