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.
fonte
Respostas:
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.
fonte
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
e1 - 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:groundDensity + waterDensity
, como seus vizinhosO 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.
fonte