Como simular pressão com partículas?


11

Estou tentando simular a pressão com uma coleção de partículas esféricas em um jogo do Unity que estou construindo. Algumas notas sobre o problema:

  • O objetivo é preencher um espaço / vazio 2d em constante mudança com pequenas esferas sem atrito. O jogo está tentando simular a pressão crescente de mais objetos sendo empurrados para este espaço.
  • O nível em si está rolando constantemente da esquerda para a direita, ou seja, se as dimensões do espaço não forem alteradas pelo usuário, ele ficará automaticamente menor (a parte mais à esquerda do espaço rolará continuamente para fora da tela).

Eu estou querendo saber o que algumas abordagens são que eu posso tomar para resolver esses problemas ...

  1. Saber quando detectar quando há espaço para preencher e adicionar esferas ao espaço.
  2. Removendo esferas do espaço quando estiver encolhendo.
  3. Estratégias para simular a pressão nas esferas, de forma que elas "explodam para fora" quando mais espaço é criado.

A abordagem atual que estou pensando em usar uma parede em movimento constante, que está fora da tela e se move com a tela, como mostra a imagem:

pressão!.

Essa parede em movimento empurrará e prenderá as esferas no espaço. Quanto à adição de novas esferas, eu teria que (1) esferas se replicar ao detectar espaço livre, OU (2) gerá-las no lado esquerdo do espaço (onde está a parede) - empurrando o restante das esferas para preencha o espaço. Prevejo problemas com a idéia nº 1, porque isso provavelmente não criaria / simularia pressão; A idéia nº 2 parece mais promissora, mas levanta a questão de como fornecer um local para a geração dessas novas partículas de esfera (e as ramificações de gerá-las quando não há espaço).

Muito obrigado antecipadamente por sua sabedoria!

Respostas:


6

Não sei exatamente o que você deseja alcançar. A parede está empurrando as partículas enquanto o espaço sai da tela como uma mecânica de jogo?

Quanto aos seus três pontos, acho que todos esses comportamentos surgiriam se você tratasse suas partículas da seguinte maneira: faça com que cada partícula repulse qualquer outra partícula inversamente proporcional à distância e também colidir com as paredes do seu espaço para detê-las.

As partículas próximas umas das outras se repelem e, assim, se espalham para preencher o espaço vazio até serem interrompidas por obstáculos. Se / quando as paredes se moverem para diminuir o espaço e empurrarem as partículas, elas serão empurradas para mais perto de outras partículas, repelindo-as com mais força que, por sua vez, empurrarão outras partículas, aumentando a pressão geral.

Isso seria bem semelhante a uma simulação de corpo n com atração negativa; portanto, dependendo do número de partículas, pode ser bastante caro calcular a repulsão de cada partícula com todas as outras. Você poderia tentar simplificar isso fazendo com que cada partícula seja repelida apenas pelo centro de gravidade médio de sua massa de partículas, que pode produzir um comportamento estranho em longas áreas finas com curvas (seu gás não se expande para áreas que se afastam da centro de gravidade, por exemplo).

Quanto à criação e exclusão de partículas (para garantir que exista a quantidade certa para preencher visualmente o espaço que presumo?), Você provavelmente desejaria não adicionar ou remover partículas apenas quando a densidade estiver ausente, o que introduziria mais partículas repelindo outras partículas e, portanto, aumentam ou diminuem a pressão.

Portanto, você pode introduzir um fator no cálculo da repulsão, digamos, comece com 1.0 e, ao adicionar x partículas, crie o novo fator n / (n + x), em que n é o número de partículas totais antes de adicionar as novas.


2

A pressão (como em um gás) é apenas o resultado de colisões elásticas simples entre suas partículas e entre as partículas e a parede. Você apenas mede a quantidade de colisões por tempo com as paredes para obter um valor para sua pressão.

As duas idéias que você dá não têm conexão direta com a pressão, pois a pressão é dada com uma quantidade constante de partículas em uma volumina fechada e em uma determinada temperatura (o que resulta nas partículas se movendo mais rápido ou mais lentamente).

Se você adicionar partículas a este sistema fechado, a pressão deverá aumentar, porque há mais energia em todo o sistema (você acabou de adicionar uma nova partícula com uma temperatura <-> velocidade).


partículas devem ter uma massa para as colisões elásticas, como as paredes são assumidos como tendo uma massa perto de + infinito
Aron_dc

Eu disse "pressão é a quantidade de colisões por tempo com as paredes", que não é 100% precisa. Em uma colisão elástica, você pega o impulso dessa partícula e mede quanto de impulso é dado à parede. Portanto, se uma partícula colide na direção vertical da parede, a parede recebe um impulso de 2 mv (m = massa da partícula; v = velocidade da partícula). Então você realmente mede o impulso recebido na parede. A partícula é apenas refletida (v antes da colisão = -v após a colisão). Isso ainda ajuda a medir a pressão de misturas de gases diferentes (m diferente para partículas).
Aron_dc 22/07/12

0

Em cada loop, você deve percorrer todas as suas partículas e calcular uma força final nessa partícula. Basicamente, a parede sempre fornece a eles um vetor de força positiva no eixo x, se eles estiverem colidindo com ela (partícula.x - partícula.r <= 0).

Então, cada partícula com a qual eles colidem também fornece um vetor de força, dependendo do ângulo entre elas. Você coleta esses ângulos para todas as partículas, calcula a média e pronto!

Existem muitas técnicas de otimização que você pode usar aqui também, basta procurar um tutorial de física da bola. Basicamente, você deseja iterar através de cada par de partículas apenas uma vez e calcular o vetor de força para ambos e armazená-lo neles.

Isso simulará gases, basicamente, e se você lhes der uma força constante, também líquidos, eu presumo.

Quanto à criação e exclusão de partículas, implementei uma classe ParticleEmitter, que possui uma posição, direção e outras coisas úteis. Seu exemplo seria melhor com um emissor que pode criar partículas em um determinado intervalo ou, melhor ainda, em um retângulo.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.