Como posso definir áreas cheias de água?

9

Gostaria de aprimorar meu pequeno mecanismo de jogo com uma simulação de água bonita. Para começar a trabalhar nisso, preciso encontrar uma maneira adequada de representar a água no jogo. Infelizmente, eu não conheço muitas representações diferentes, então vou perguntar. Há uma pergunta semelhante que fiz há algum tempo. Mas como eu não havia formulado o problema claramente, a resposta está correta, mas não o que eu estava procurando.

Em alguns jogos, a água é apenas definida por um nível de altura. Por exemplo, tudo sob a altura de zero está embaixo d'água. Eu vi essa representação em jogos (principalmente mais antigos). O problema é que eu gostaria de ter cavernas no mundo ao ar livre que não sejam inundadas e com níveis de água diferentes para cada lago e mar.

Outra representação mais precisa da ocorrência de água são partículas. Cada gota de água é armazenada como um ponto no espaço do mundo. Para renderizá-las, eu poderia usar técnicas como metaballs para que elas construíssem uma única malha. Essa representação seria ótima para realismo, pois eu poderia calcular facilmente a dinâmica entre elas. Infelizmente, nenhuma máquina conseguiu calcular um oceano de metabólitos em tempo real.

Existem outras maneiras de representar a água em um motor? Eu gostaria de ter lagos dinâmicos, portanto, definir a área da água por uma geometria estática não é uma opção. Por exemplo, se o jogador modifica o terreno para alargar um lago, a água deve preencher essa baía e o nível geral da água desse lago deve diminuir um pouco.

danijar
fonte
2
Como o seu terreno está organizado no mecanismo? Existem diferentes técnicas para terrenos com voxel vs. mapa de altura x terreno de polissupoes (malha).
Exilyth
É dado como uma malha e a água não deve trocar essa malha do terreno de maneira diferente de outras malhas estáticas.
Danijar
11
comércio ou tratamento?
Tom 'Blue' Piddock
11
Existem algumas demos muito boas dessa abordagem metabólica, mas não a considero utilizável em nenhum jogo real que não esteja totalmente focado no fato de que a simulação da água é, até certo ponto, fisicamente crível. Eu não vejo uma razão contra apenas uma malha, também não deve ser um problema ajustá-la às condições ou mesmo gerá-la com base em alguma simulação física. Mas isso é algo que você só quer fazer se for realmente necessário. Como referência para simulação de água semi-realista, convém verificar "From Dust".
Slin
11
A solução de tamanho variável foi para o problema "oceano de metaballs". Além disso, é claro que haveria limites para a variação de tamanho, dependendo do volume, pois é um meio de otimizar o desempenho, não alterando o volume de água. Basta adicionar uma consideração especial, como proximidade com o jogador e a superfície, para áreas que precisam de detalhes como cachoeiras, afluentes, margens ou riachos.
Attackfarm

Respostas:

3

Não sei dizer o que é comumente usado, mas meu primeiro pensamento seria usar um sistema de partículas com partículas de tamanhos variados representando água de vários volumes. O topo da água usaria partículas menores para formar as ondulações da superfície e das ondas, a água mais próxima do jogador usaria as menores para simular respingos e pequenas ondulações, enquanto quanto mais profunda ou profunda a água, maiores as partículas . Isso permitiria um número dinâmico de partículas simulando água de qualquer tamanho, dinâmica da água à medida que ela muda e algum nível de desempenho razoável e controlado.

Eu vejo problemas com essa implementação, mas certamente parece uma solução relativamente simples e "suficientemente boa" que um espectador / jogador ficaria duvidoso em perceber desvios na simulação.

Attackfarm
fonte
2

Se você estivesse usando um terreno baseado em voxel, além de armazenar a densidade do solo por voxel, também poderia armazenar um valor de água preso entre 0 e 1 - groundDensity. Desenhar a água seria tão simples quanto passar os cubos em marcha sobre os valores da água. Simular a água seria um pouco mais difícil, mas a premissa básica é que você deseja resolver o sistema de modo que:

  1. A água abaixo da superfície deve encher o restante do voxel
  2. A água no nível da superfície deve ter a mesma densidade total groundDensity + waterDensity, como seus vizinhos
  3. A água pode ser deslocada para qualquer voxel imediatamente adjacente e abaixo dele, desde que a densidade total do vizinho seja menor que sua densidade total

O algoritmo ideal seria executado em um shader de computação, um caminho de execução por voxel. Se você quiser ser extravagante, também poderá armazenar a velocidade da água nesse voxel para obter efeitos adicionais de simulação: por exemplo, tentando distribuir uma quantidade de água proporcional à velocidade das células "apontadas" pelo vetor de velocidade. Esses dados de velocidade também podem ser usados ​​para mover as ondas, desenhar corredeiras, etc.

jmegaffin
fonte
Infelizmente, não tenho terreno voxel, como apontado nos comentários sob a pergunta. Obrigado mesmo assim.
Danijar