Criação 2D de Chuva (e Dinâmica de Fluidos)

11

Estou experimentando as condições climáticas em um jogo meu e fiquei impressionado com a maneira como a Starbound lidou com a chuva. Basicamente, quando a chuva atinge o solo, é dispersa horizontalmente (e absorvida pelo solo) ou cria pilhas de água (quando as gotas de chuva caem dentro de um buraco no solo).

Este vídeo demonstra isso claramente: http://imgur.com/gallery/CKCGKbG

Eu sei como fazer a chuva cair e checar onde ela bate no chão, mas é aí que eu fico preso. Minha pergunta é: como isso pode ter sido criado? E como modelar a água fluir tão perfeitamente, sem prejudicar o desempenho?

Desde já, obrigado!

Pandaqi
fonte
1
A chave é o sistema de dinâmica de fluidos. Suspeito que, quando uma gota de chuva atinge o chão, gera uma pequena quantidade de água nessa posição, que é então processada pelo sistema de dinâmica de fluidos como de costume. Em superfícies planas é combatida por evaporação, mas quando as encostas fazem com que a água se concentre em uma área, o influxo é mais forte do que a evaporação e as poças começam a se formar.
Philipp

Respostas:

9

O sistema de água da Starbound é na verdade autômatos celulares baseados em blocos 2D. Cada ladrilho na tela que não contém uma camada de ladrilho frontal é capaz de reter água. A quantidade de água é calculada através de autômatos celulares.

Mais informações sobre esta técnica aqui:

http://www.gamasutra.com/view/feature/134736/an_intro_to_cellular_automation.php

http://www.jgallant.com/2d-liquid-simulator-with-cellular-automaton-in-unity/

Quanto às gotas de chuva, são partículas. Eles servem principalmente para fingir que realmente há água caindo do céu. A água se acumula apenas porque o jogo sabe que está chovendo. As gotas individuais não têm nada a ver com a formação real das piscinas de água.

A maneira como eles acumulam é determinando onde existem buracos na camada superior do solo. Se houver uma área que possa acumular água, as células nessa área aumentam seus níveis de água de acordo.

O Starbound também lida com a pressão da água, e sua técnica de renderização é bastante surpreendente. Eles têm a melhor implementação 2D da física de simulações de água usando autômatos celulares que eu já vi.

Aqui está uma visão primitiva de um mecanismo de física líquida, utilizando a técnica de autômatos celulares acima mencionada. A parte de renderização se torna um pouco mais complexa, pois sua água é representada por um valor numérico.

http://www.jgallant.com/images/pressuretest.gif

Neste exemplo, uma melhoria muito simples seria ocultar células de água que tenham menos de 1 unidade de água completa em seu ladrilho, se não houver ladrilho sólido abaixo dele. Mas então, você está escondendo o fluxo de água. Em vez de escondê-lo, você teria que determinar como a água está fluindo e depois desenhar o sprite de água apropriado em seu lugar.

jgallant
fonte
2
Para adicionar ao fato de que as partículas de gota de chuva fingem o efeito da queda de água: as pequenas gotas de água na superfície também não estão relacionadas às partículas de chuva reais, mas a um efeito separado. A combinação faz parecer que as gotas causam salpicos.
Felsir 5/10/16
Uau, é exatamente isso que eu estava procurando. Eu pensei que teria que recorrer a algum sistema de fluido excessivamente complexo baseado em partículas, mas os sistemas de grade parecem funcionar da mesma forma. No entanto, para adicionar pressão da água, acho que você só precisa de uma segunda matriz que armazene valores e fluxos de pressão de locais de alta pressão para baixa pressão? Nesse caso, isso ainda não deve ser muito difícil para o computador.
76016 Pandaqi
Não, tudo o que você precisa fazer com a pressão é adicionar uma regra, como, é permitido que um bloco contenha mais de 1 unidade completa de líquido. Se esse ladrilho tiver mais de 1 unidade completa de líquido e não for capaz de fluir de acordo com o conjunto normal de regras - faça-o fluir para cima. Ajuste para permitir que mais água flua com base no valor pressurizado desse ladrilho.
jgallant
3

Existem várias maneiras de abordar isso. Como sempre 'depende'

E então eu acho que uma maneira seria dessa maneira. Dado um 'mergulho no chão' arbitrário Sobreponha uma 'caixa d'água' que a limita. O chão e a caixa d'água são desenhados em camadas, de modo que o chão seja mostrado primeiro, a caixa d'água depois.

toda vez que uma gota de água atingir o mergulho no solo, adicione uma à caixa d'água. Quando a caixa d'água atingir um número mágico, adicione uma linha de água. Digamos que 10 gotas caiam no mergulho, isso adiciona uma linha à caixa d'água.

Digamos que o waterbox tenha 32X32 pixels. Adicione uma linha de cor de água entre 0,31-31,31. Outras 10 gotas, desenhe uma linha de 0,30 a 31,30. Assim, à medida que as gotas se acumulam, você constrói a caixa d'água a partir do fundo até que fique cheia.

Espero que isso faça sentido.

RobM
fonte