• Nenhum resultado encontrado

Nas seções 5.4 e 5.2 foram descritas como são implementadas simulações de líquidos e corpos rígidos respectivamente. Note que em ambas as simulações, de líquido e corpos rígidos, é utilizado o mesmo sistema de detecção de colisão baseado no uso de uma grade uniforme. Assim, podemos simplesmente computar forças entre par- tículas e mudar as propriedades físicas do líquido e dos corpos rígidos que interagem na simulação.

No processo de detecção de colisão, partículas de corpos rígidos são consideradas como partículas de fluido, e o cálculo da força para cada partícula de corpo rígido consiste em computar fi,f luid e fi,rigid, onde fi,f luid = fipress+ fivis. Logo, cada corpo

torques de todas as partículas que o compõem (equação 5.41).

Fj =

X

i∈RBj

(fi,rigid+ fi,f luid) Tj =

X

i∈RBj

ri0 × (fi,rigid+ fi,f luid)

(5.41)

Obtendo estas forças e torques, as posições e orientações dos objetos são atua- lizadas como descrito na subseção 5.2.1, e as partículas também atualizadas para suas novas posições.

Já no caso de partículas de líquido, a atualização de propriedades físicas é reali- zada utilizando o método SPH descrito na seção 5.4.

Capítulo 6

Renderização da superfície de

líquidos

Métodos de simulação baseado em partículas tem se tornado populares para criar animações de fenômenos físicos tais como movimento de líquidos, mistura com só- lidos, derretimento de sólidos, etc. Entretanto, extrair e visualizar uma superfície que delimita o volume de partículas não é trivial e resulta num processo custoso, especialmente quando há uma grande quantidade de partículas. De modo geral, um líquido pode fluir por todo o cenário, exceto quando está contido em algum tipo de recipiente. Frequentemente, nos métodos eulerianos, o domínio do fluido é definido como uma grade finita que permite resolver as equações de movimento e aproximar a superfície do líquido. Entretanto, uma simulação aceitável para esse método requer uma grade de resolução fina, o que resulta custoso no processamento e uso de me- mória. Assim, os métodos que usam partículas se adaptam melhor para aplicações interativas.

A seguir são apresentados métodos de extração de superfície comumente uti- lizados. No entanto, damos ênfase ao método apresentado por Laan [26], que é um método baseado no espaço da imagem, e apresenta melhores resultados para simulação de líquidos densos.

6.1

Renderização usando marching cubes

Nosso objetivo, nesta parte do trabalho, é a renderização da superfície de um líquido representado por partículas. Entretanto, uma renderização eficiente, visualmente realista e em tempo real ainda é difícil de conseguir. O primeiro desafio é encontrar a superfície do líquido. A maioria de técnicas adotam o uso de uma grade regular para manter uma isosuperfície atualizada, a cada passo de tempo durante uma simulação. Assim, a renderização da superfície do líquido é equivalente à renderização de uma

isosuperfície.

A base para a renderização de uma isosuperfície é uma representação discreta do campo escalar correspondente à densidade do fluido. A técnica de marcha de

cubos [25], utiliza uma amostragem da função de densidade realizada nos vértices de

uma grade regular. Foi realizado uma implementação desta técnica onde, além da grade que guarda os valores do campo escalar do volume do fluido, uma grade que representa um campo vetorial correspondente ao gradiente dos vértices da superfície é usada.

Esta implementação foi feita na plataforma CUDA e consta de 5 etapas.

• A grade que representa o campo escalar da densidade do fluido é gerada usando as partículas SPH.

• A grade é avaliada nos vértices dos voxels e computa o número de vértices que cada voxel ira gerar.

• Os voxels que geraram triangulaçoes não nulas são selecionados.

• Os voxels não nulos são avaliados para gerar triângulos. dependendo da quan- tidade de vertices gerados no passo 2. Neste passo são atualizados dois arrays: de posições e normais de vértices da malha gerada. Não se sabe a priori quan- tos vértices serão gerados, a cada passo de tempo, por tanto, se usa um valor máximo estimado a partir das dimensões da grade.

• Renderização da malha de triângulos. Os arrays de posições e nor- mais estão ordenados sequencialmente e mapeados na memória da GPU, e cada intervalo de três elementos, nos arrays de posições e normais, re- presenta um triângulo. Assim, basta executar uma chamada à função

glDrawArrays(GL_T RIAN GLES, 0, totalV erts).

A pesar de a técnica de marcha de cubos ser bastante utilizada para visualizar dados volumétricos estáticos, onde novos dados de isosuperfícies são gerados rara- mente, para a visualização de líquidos representados por conjuntos de partículas, não resulta ser uma técnica adequada. Como o tempo gasto para a geração/atuali- zação da grade que representa a densidade volumétrica do fluido é muito alto, esta se converte num gargalo, comprometendo o desempenho da simulação. Um exemplo simples é mostrado na figura 6.1, onde 1000 partículas são renderizadas usando a técnica de metaballs. Pode se notar que a superfície das pequenas esferas (que repre- sentam partículas) se mostram facetadas, o que não é adequado para renderização de líquidos. Um outro exemplo (ver figura 6.2) tenta simular líquido num tanque cilíndrico. A simulação contém 10K partículas roda a 25fps numa GeForce GTS450.

Estes resultado, demonstram que, a pesar do processamento paralelo, o uso da téc- nica de marcha de cubos não é uma alternativa para ser usada em simulações de tempo real que requeiram grandes quantidades de partículas. O gráfico da figura 6.3 mostra os tempos gastos em cada etapa da geração de superfície usando a técnica de metaballs e marcha de cubos para o exemplo com 10K partículas. Note que o processo de geração de triângulos gasta muito mais tempo que o resto de processos, reduzindo consideravelmente o número de quadros por segundo numa simulação de líquido.

Figura 6.1: Superfície de partículas de fluido utilizando a técnica metaballs.

Figura 6.2: Superfície gerada usando a técnica marching cubes para um conjunto de 10k partículas.

Figura 6.3: Tempos gastos em cada etapa na geração de superfície com a técnica de marcha de cubos para 10k partículas (ver figura 6.2).