# Sistema de partículas

Um sistema de partículas é uma técnica em física de jogos, gráficos em movimento e computação gráfica que utiliza muitos pequenos sprites, modelos 3D ou outros objetos gráficos para simular certos tipos de fenômenos "difusos". Esses fenômenos são, geralmente, altamente caóticos, ocorrem na natureza ou resultam de reações químicas, sendo, por isso, desafiadores de reproduzir por meio das técnicas de renderização convencionais.
A introdução deste conceito ocorreu no filme de 1982 Star Trek II: The Wrath of Khan para o efeito fictício conhecido como "Efeito Gênesis". Outros exemplos incluem a replicação de fenômenos como fogo, explosões, fumaça, movimento da água (como uma cachoeira), faíscas, folhas caindo, deslizamentos de rochas, nuvens, neblina, neve, poeira, rastros de meteoros, estrelas e galáxias, ou efeitos visuais abstratos como trilhas brilhantes, feitiços mágicos, entre outros. Para criar esses efeitos, são utilizadas partículas que desaparecem rapidamente e são então reemitidas a partir da fonte do efeito. Uma outra técnica pode ser empregada para objetos que contêm muitos fios, como pelos, cabelos e gramíneas. Nesse caso, é renderizada toda a vida de uma partícula de uma só vez, o que pode então ser desenhado e manipulado como um único fio do material em questão.
Os sistemas de partículas são conceituados como um agrupamento de pontos no espaço, orientados por um conjunto de regras que delineiam sua conduta e aparência. Esses sistemas de partículas servem como modelos para fenômenos ao representá-los como uma assembleia dispersa de partículas. Eles empregam processos estocásticos com o propósito de simplificar a descrição de sistemas dinâmicos e princípios da mecânica de fluidos, os quais, devido à sua complexidade, são desafiadores de serem representados por meio de transformações afins.

## Implementação típica

Os sistemas de partículas normalmente implementam os seguintes módulos:
* Um estágio de emissão, que fornece uma localização e gera novas partículas.
* Uma etapa de simulação, que atualiza parâmetros e simula como as partículas evoluem.
* Um estágio de renderização, que especifica como renderizar cada partícula.

### Estágio de emissão

Um emissor em um sistema de partículas tem como papel a definição do comportamento das partículas geradas. Ele controla a taxa de geração das partículas, ou seja, quantas partículas são criadas por unidade de tempo, e também determina o vetor de velocidade inicial das partículas, que indica a direção em que elas são emitidas quando são criadas.
Quando se utiliza um objeto de malha como emissor, uma técnica comum é configurar o vetor de velocidade inicial para ser normal à(s) face(s) individual(is) do objeto. Isso significa que as partículas serão emitidas diretamente a partir de cada face do objeto, criando um efeito visual em que as partículas parecem "sair" das superfícies do objeto. É importante ressaltar que essa abordagem é opcional e pode ser ajustada de acordo com as necessidades específicas do design do sistema de partículas.

### Estágio de simulação

Durante a etapa de simulação, o número de novas partículas a serem criadas é calculado com base nas taxas de geração e no intervalo entre atualizações. Cada uma dessas partículas é então gerada em uma posição específica no espaço tridimensional, levando em consideração a posição do emissor e a área de geração especificada. Todos os parâmetros das partículas (como velocidade, cor, etc.) são inicializados de acordo com os parâmetros do emissor.
A cada atualização, todas as partículas existentes são verificadas para determinar se ultrapassaram sua vida útil, sendo removidas da simulação caso isso ocorra. Caso contrário, a posição e outras características das partículas são avançadas com base em uma simulação física. Essa simulação pode variar desde a simples tradução da posição atual das partículas até cálculos de trajetória fisicamente precisos, levando em consideração forças externas como gravidade, atrito, vento, entre outras.
É comum realizar a detecção de colisões entre as partículas e objetos tridimensionais especificados na cena, permitindo que as partículas interajam com obstáculos no ambiente, como quicar ou desviar. No entanto, colisões entre as próprias partículas raramente são usadas, pois são computacionalmente intensivas e geralmente não têm relevância visual na maioria das simulações.

### Estágio de renderização

Após a conclusão do estágio de atualização, cada partícula é renderizada, geralmente na forma de um quadriculado texturizado (ou seja, um quadrilátero que está sempre voltado para o espectador). No entanto, em alguns casos, isso pode não ser necessário em jogos, onde uma partícula pode ser representada por um único pixel em ambientes de baixa resolução ou com limitações de poder de processamento. Por outro lado, em gráficos de movimento, as partículas costumam ser modelos 3D completos, mas em pequena escala e fáceis de renderizar, garantindo fidelidade mesmo em alta resolução.
Em algumas aplicações de renderização offline, as partículas podem ser representadas como Metaballs; isosuperfíciescalculadas a partir de partículas-Metaballs podem criar líquidos bastante convincentes. Além disso, objetos de malha 3D podem "substituir" as partículas - por exemplo, uma tempestade de neve pode ser composta por um único objeto de malha 3D de flocos de neve duplicado e rotacionado para corresponder às posições de milhares ou milhões de partículas. Essas técnicas de renderização oferecem flexibilidade e otimização na representação visual das partículas, permitindo escolher a abordagem mais adequada ao contexto da aplicação.

## Taxonomia do Sistema de Partículas

Em 1983, Reeves definiu apenas pontos animados, criando simulações de partículas em movimento - como faíscas, chuva, fogo, entre outros. Nestas implementações, cada quadro da animação contém cada partícula em uma posição específica em seu ciclo de vida, e cada partícula ocupa uma única posição no espaço, representada como um ponto.
Para efeitos como fogo ou fumaça, que se dissipam com o tempo, cada partícula é atribuída a um tempo de desvanecimento ou uma vida útil fixa. No caso de efeitos como tempestades de neve ou chuva, geralmente a vida útil da partícula é encerrada assim que ela sai de um campo de visão específico, uma vez que não é mais relevante para a cena.
Em 1985, Reeves expandiu o conceito para incluir a renderização simultânea de todo o ciclo de vida de cada partícula. O resultado disso transforma as partículas em fios estáticos de material que exibem a trajetória geral em vez de serem apenas pontos. Esses fios podem ser usados para simular cabelos, pelos, grama e materiais similares. Os fios podem ser controlados com os mesmos vetores de velocidade, campos de força, taxas de geração e parâmetros de deflexão que as partículas animadas obedecem.
Além disso, a espessura renderizada dos fios pode ser controlada e, em algumas implementações, pode variar ao longo do comprimento do fio. Diferentes combinações de parâmetros podem conferir rigidez, flexibilidade, peso, rigidez, ou qualquer número de outras propriedades aos fios. Os fios também podem utilizar mapeamento de textura para variar a cor, comprimento ou outras propriedades ao longo da superfície do emissor. Essa abordagem oferece uma maneira versátil de representar materiais fibrosos e cabelos, permitindo uma ampla gama de resultados visuais.
Em 1987, Reynolds introduziu as noções de comportamentos de bando, pastoreio ou cardume. O modelo boids estende a simulação de partículas para incluir interações com o estado externo, tais como busca por metas, evitamento de colisões, centralização do grupo e percepção limitada.
Em 2003, Müller estendeu os sistemas de partículas para a área da fluidodinâmica, simulando viscosidade, pressão e tensão superficial, e posteriormente representando as superfícies por meio da interpolação das posições discretas com a Hidrodinâmica de Partículas Suavizadas (Smoothed Particle Hydrodynamics - SPH).

## Ferramentas amigáveis para desenvolvedores de sistemas de partículas

Sistemas de partículas são componentes cruciais em motores de jogos, sistemas de criação de conteúdo digital e aplicações de efeitos visuais. Eles são responsáveis por simular efeitos como fogo, fumaça, explosões e muitos outros elementos dinâmicos em jogos e simulações. Esses sistemas podem ser criados a partir do zero ou obtidos por meio de download de bibliotecas e APIs disponíveis no mercado.
Há diversas opções quando se trata de APIs de sistemas de partículas. A Havok, por exemplo, oferece múltiplas APIs de sistemas de partículas, sendo a Havok FX API uma delas, focada especialmente em efeitos de partículas em sistemas. A Ageia, que agora é uma subsidiária da Nvidia, disponibiliza um sistema de partículas, além de outras APIs relacionadas à física de jogos, que são amplamente utilizadas em muitos jogos, incluindo aqueles baseados na Unreal Engine 3.
Para desenvolvedores independentes, amadores ou estudantes de jogos, ferramentas como o GameMaker Studio e o Unityoferecem sistemas de partículas bidimensionais que são de fácil acesso e utilização. No entanto, é importante observar que esses sistemas muitas vezes não são diretamente compatíveis com outros motores de jogos. Portanto, sua aplicação é geralmente restrita a projetos específicos dentro dessas plataformas.
Além das opções mencionadas, é importante destacar que muitas outras soluções e bibliotecas estão disponíveis para o desenvolvimento de sistemas de partículas. Em situações em que efeitos ou comportamentos não convencionais são necessários, é comum que os desenvolvedores optem por criar seus próprios sistemas de partículas do zero. Isso oferece a flexibilidade necessária para alcançar resultados personalizados e exclusivos.