Escrevi um simulador de água bastante simples (em 2D, mas facilmente extensível para 3D). Basicamente, utilizo cerca de 10.000 partículas, cada uma convenientemente representada por um pixel quadrado! O processo segue os passos descritos abaixo:

Etapas do Algoritmo

  1. Posicionamento Inicial das Partículas
    Coloque todas as partículas de líquido no mesmo ponto (essa etapa é crucial). Para um recipiente, por exemplo, as partículas podem ser colocadas no topo interno e, em seguida, deixadas fluir para preencher o restante do recipiente. Depois disso, abra a saída (inferior, superior ou lateral) para permitir que o líquido escoe.
    Essa etapa de “relaxamento” é essencial, pois organiza corretamente as partículas para que as mais baixas sejam atualizadas primeiro. Esse comportamento faz com que bolhas de ar subam quando o fluido desloca espaços vazios, criando uma aparência realista (para olhos não treinados).

  2. Movimento do Fluido
    Para mover o fluido, execute o seguinte:

    • Percorra todas as partículas de fluido:
      • Se houver um espaço livre abaixo de uma partícula, mova-a um pixel para baixo.
      • Caso contrário, verifique aleatoriamente à esquerda ou à direita e mova a partícula para essa direção, se possível.
      • Se a partícula estiver em queda livre por mais de 2 iterações, mova-a aleatoriamente da esquerda para a direita com baixa probabilidade, para criar um efeito de espalhamento.
    • Repita o processo para todas as partículas.

E é isso! Esse método cria a impressão de um fluido com alto número de Reynolds. Obviamente, não se trata de uma simulação física precisa, pois não há pressão sendo calculada.

Melhorias Visuais

Para criar um efeito mais realista, você pode:

  • Alterar a cor do fluido para tons mais claros de azul ao se mover lateralmente.
  • Em quedas livres, mudar para tons ainda mais claros de azul.
  • Quando o fluido se move lateralmente em queda livre, altere a cor para branco por uma iteração. Também faça isso ao passar de queda livre para estacionário.

Testei esse método com 20.000 “moléculas” de água em uma tela de aproximadamente 1000x500 pixels, e o resultado é incrível, especialmente quando o fluido se desloca de um objeto para outro.

Extensão para 3D

Essa técnica pode ser facilmente estendida para 3D. No entanto, seria necessário um número imenso de partículas para criar uma imagem voxel. Uma alternativa seria usar partículas de tamanho finito, como cuboides, e realizar as comparações de forma vetorial. Claro, seu “ralo” precisaria ser grande o suficiente para permitir a passagem de um cuboide!