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!
2d
water
fluid-dynamics
Pandaqi
fonte
fonte
Respostas:
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.
fonte
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.
fonte