Como fazer o efeito bem da gravidade Geometry Wars

11

Eu não estou falando sobre a grade de fundo aqui, estou falando sobre as partículas swirly circulando pelos Gravity Wells! Eu sempre gostei do efeito e decidi que seria um experimento divertido replicá-lo. Sei que a GW usa a lei de Hooke em todo o lugar, mas não acho que o efeito Particle-to-Well seja feito com molas. parece uma função ao quadrado da distância.

Aqui está um vídeo demonstrando o efeito: http://www.youtube.com/watch?v=YgJe0YI18Fg

Posso implementar um efeito de mola ou gravidade em algumas partículas, é fácil. Mas não consigo obter o efeito parecido com o efeito GWs. Quando assisto ao efeito no jogo, parece que as partículas são emitidas em cachos do próprio Poço, espiralam para fora em torno do centro do poço e acabam sendo arremessadas para fora, voltando para o poço e repetindo.

Como eu faria as partículas espiralarem para fora quando geradas? Como eu manteria os grupos de partículas juntos quando perto do Poço, mas me afastaria um do outro quando lançados para fora? Como eu manteria as partículas tão fortemente presas ao Poço?

EDIT:
http://www.youtube.com/watch?v=1eEPl8kOXN8 <- Vídeo
https://dl.dropbox.com/u/49283213/gw.gif <- GIF do caminho da partícula

Desativei a randomização no GW para facilitar a visualização do efeito de partícula. Aqui está um vídeo em que você pode ver um dreno azul-verde enviando seu monte de partículas. As partículas vermelhas são das explosões que normalmente aparecem em todo o lugar. Algumas observações que fiz do vídeo:

  • As partículas são emitidas do centro (ou próximo do centro) do dreno
  • Todas as partículas estão sendo forçadas em um movimento no sentido horário ao redor do centro; portanto, algum tipo de movimento tangencial está sendo aplicado; você pode ver isso facilmente quando as partículas vermelhas da explosão se aproximam do dreno.
Pedra de Mykel
fonte

Respostas:

7

A partir do vídeo mostrado, parece ser uma gravidade simples para mim. Muitas pessoas pensam que a gravidade faz as coisas voarem para baixo, mas, olhando de uma perspectiva mais distante, ela faz as coisas voarem em um movimento elíptico ou espiral em torno do centro. As partículas são sempre aceleradas em direção ao centro, mas voam além dele até que a gravidade o force a voltar, repetidas vezes. Algumas partículas voam tão longe que a gravidade não as afeta mais e acabam queimando antes de mudar de direção.

Cada partícula tem uma velocidade X e Y, à qual cada quadro é adicionado à gravidade, dependendo do ângulo e da distância do centro. A gravidade sempre adiciona velocidade na direção (ângulo) do centro.

Então você tem para a partícula: posição, velocidade
Para a gravidade, você tem: posição, força

A partir das posições, você pode calcular o ângulo entre a partícula e a gravidade. Para calcular o ângulo, você precisará dos deltas entre as duas coordenadas.

dx = particle.x - gravity.x; dy = particle.y - gravity.y
angle = atan2(dy, dx)

Esse ângulo é o ângulo do vetor de velocidade que precisa ser adicionado.

A quantidade de força aplicada depende da distância. Para ser exato, diminui pelo quadrado da distância. Portanto, se algo estiver duas vezes mais distante, apenas um quarto da força será aplicada. Para a distância, os deltas também são necessários.

distance = sqrt(dx*dx + dy*dy)
force = gravity.strength / distance*distance

Agora você tem a força e o ângulo, basta aplicá-los:

particle.velocity.x += force * sin(angle)
particle.velocity.y += force * cos(angle)
API-Beast
fonte
sua solução é bastante semelhante à minha, mas usa atan, sin, cos, sqrt, ... portanto, pode ficar muito lento. é melhor evitar a parte atan / sin / cos, veja meu post para ver uma (talvez não a melhor) fazer com mais rapidez.
GameAlchemist
Não é otimizado, por isso é melhor compreensível.
API-Beast
você está certo em fazê-lo, mas acho que a resposta é muito mais útil, especialmente para aqueles que não são fortes em coisas de cos / sin, se você colocar o pseudocódigo 'otimizado' após a explicação teórica.
GameAlchemist
Sei que o código aqui não está otimizado, mas parece que você pode evitar a chamada sqrt () à distância, já que você o usa imediatamente um momento depois, esquadrinhando-o.
Kyle Baran
2

parece-me que o que é desenhado é segmentos, não pontos. Então eu acho que o poço ejeta um ponto do círculo, com uma alta velocidade e um vetor de velocidade tangente ao círculo. E outro ponto é lançado logo depois, que está vinculado ao primeiro a desenhar um segmento. Então eu acho que as leis da física (Newton) são aplicadas com uma forte gravidade, o que explica a diminuição da velocidade. Então, acho que você precisa se integrar a tempo de fazer isso.

com: C o centro do poço, R seu raio.
P1 é o ponto que consideramos
K ser uma constante 'grande' que você escolhe em algumas tentativas (massa do poço).
vel0 é o vetor de velocidade inicial, tangencial ao círculo.
vel0 deve ser alto (faça também os testes)
pos0 a posição inicial, no círculo, no tempo t0.
: d distância entre C e P1
: Vn vetor normal C P1

accx= - Vnx * K * 1 / square(d)   ; accy = - Vny * K * 1/square (d)  
velx = accx*(t-t0) + vel0x   ;   vely = accy(t-t0) + vel0y  
posx= (1/2)*accx*square(t-t0) + vel0x*(t-t0) + pos0x   ;   
posy= (1/2)*accx*square(t-t0) + vel0y*(t-t0) + pos0y   

Inic: A maneira mais fácil de gerar um novo ponto é escolher um ângulo A e, em seguida:

  pos0x= Cx +R *cos(A)  ; pos0y = Cy + R*sin(A)  
  vel0x = v0*sin(A)   vel0y =  - v0*cos(A)     v0= float constant.

update: para cada iteração você deve calcular:

d= square root( square(P1x-Cx)+square(P1y-Cy) )  
Vnx= (P1x-Cx)/d   ;   Vny=(P1y-Cy)/d  
acc (accx,accy) and finally pos (posx, posy)  as described above.     

não é necessário calcular a velocidade.
talvez o jogo use algum tipo de atrito, então a equação seria diferente.
observe que você usa várias vezes cos (A) e pecado (A), então guarde-os.

Portanto, se você gerar muitos pontos vinculados dois a dois e ao mesmo tempo alterar o ângulo inicial A para que a fonte do segmento gire em torno do poço, você se aproxima bastante da solução, eu acho.

Edit: eu acho que você deve tentar isso sem atrito primeiro, pode estar ok. atrito é uma força proporcional à velocidade, mas que inverte a direção do vetor. então a equação se torna:

    Acc = Gravity force + Friction Force.

com força de atrito = - constante * Vel. isso eu não sei como integrar, então eu iria para uma integração passo a passo:

   Vel(t+dt) = vel(t) + acc(t)*dt,   
   pos(t+dt)= pos(t)+ vel(t)*dt.  

Haverá um problema de estabilidade numérica, mas como o tempo de vida das partículas é curto, isso não deve ser um problema.

GameAlchemist
fonte
O que teria que mudar na equação sob a influência do atrito? Tenho algumas soluções para esse problema, mas estou interessado em ouvir a sua.
Mykel Stone
0

Finalmente consegui, uma replicação satisfatória do comportamento das partículas.

http://www.openprocessing.org/sketch/73624

O efeito é um efeito de gravidade padrão com uma torção, quando as partículas atingem um determinado intervalo uma força é aplicada na tangente normal. isso faz com que as partículas "orbitam" de uma maneira bastante instável. As partículas no desenho de processamento não queimam, mas no ápice de sua órbita é quando elas queimam e outro grupo é liberado. Obrigado a todos pela ajuda, mesmo que ela não tenha realmente me fornecido novas informações, é muito importante que você dedique o tempo e o esforço que dedicou às suas respostas. Obrigado novamente!

Pedra de Mykel
fonte