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.


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.


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.


Infelizmente, não tenho terreno voxel, como apontado nos comentários sob a pergunta. Obrigado mesmo assim.
— Danijar
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.