Come eseguire bene l'effetto gravità Geometry Wars


11

Non sto parlando della griglia di sfondo qui, sto parlando delle particelle swirly che circolano nei Gravity Wells! Mi è sempre piaciuto l'effetto e ho deciso che sarebbe stato un esperimento divertente replicarlo, so che GW usa la legge di Hooke dappertutto, ma non penso che l'effetto Particle to Well sia fatto usando le molle, sembra una funzione al quadrato della distanza.

Ecco un video che dimostra l'effetto: http://www.youtube.com/watch?v=YgJe0YI18Fg

Posso implementare un effetto a molla o gravità su alcune particelle bene, è facile. Ma non riesco a far sembrare l'effetto simile all'effetto GW. Quando guardo l'effetto nel gioco sembra che le particelle vengano emesse in gruppi dal Pozzo stesso, si muovono a spirale verso l'esterno attorno al centro del pozzo, e alla fine vengono lanciate verso l'esterno, ricadono verso il pozzo e si ripetono.

Come renderei le particelle a spirale verso l'esterno quando vengono generate? Come potrei tenere uniti i gruppi di particelle vicino al Pozzo ma allontanandoli l'uno dall'altro quando vengono proiettati verso l'esterno? Come terrei le particelle così fortemente attaccate al pozzo?

EDIT:
http://www.youtube.com/watch?v=1eEPl8kOXN8 <- Video
https://dl.dropbox.com/u/49283213/gw.gif <- GIF del percorso delle particelle

Ho disabilitato la randomizzazione all'interno di GW per rendere più facile vedere l'effetto delle particelle, ecco un video di minuto in cui puoi vedere uno scarico blu-verde che invia il suo gruppo di particelle. Le particelle rosse provengono dalle esplosioni che normalmente appaiono ovunque. Alcune osservazioni che ho fatto dal video:

  • Le particelle vengono emesse dal centro (o vicino al centro) dello scarico
  • Tutte le particelle vengono forzate in un movimento in senso orario attorno al centro, quindi viene applicata una sorta di movimento tangenziale, lo si può vedere facilmente quando le particelle di esplosione rosse si avvicinano allo scarico.

Risposte:


7

Dal video ha mostrato che sembra essere semplicemente una gravità per me. La maggior parte delle persone pensa che la gravità faccia volare le cose verso il basso, ma guardandola da una prospettiva più lontana fa volare le cose con un movimento ellittico o a spirale attorno al centro. Le particelle sono sempre accelerate verso il centro, tuttavia volano oltre fino a quando la gravità lo costringe a tornare, ancora e ancora. Alcune particelle volano così lontano che la gravità non le influenza più così tanto e finiscono per bruciarsi prima di cambiare direzione.

Ogni particella ha una velocità X e Y, a cui viene aggiunta ogni trama alla gravità, a seconda dell'angolo e della distanza dal centro. La gravità aggiunge sempre velocità nella direzione (angolo) del centro.

Quindi hai per la particella: posizione, velocità
Per il pozzo gravitazionale hai: posizione, forza

Dalle posizioni è possibile calcolare l'angolo tra la particella e il pozzo gravitazionale. Per calcolare l'angolo avrai bisogno dei delta tra le due coordinate.

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

Questo angolo è l'angolo del vettore di velocità che deve essere aggiunto.

La quantità di forza applicata dipende dalla distanza. Per l'esattezza, diminuisce del quadrato della distanza. Quindi se qualcosa è due volte più lontano viene applicato solo un quarto della forza. Per la distanza sono necessari anche i delta.

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

Ora hai la forza e l'angolazione che devi solo applicare:

particle.velocity.x += force * sin(angle)
particle.velocity.y += force * cos(angle)

la tua soluzione è abbastanza simile alla mia, ma usa atan, sin, cos, sqrt, ... quindi potrebbe essere molto lenta. è meglio evitare la parte atan / sin / cos, vedere il mio post per vedere uno (forse non il migliore) farlo più velocemente.
GameAlchemist,

Non è ottimizzato, quindi è meglio comprensibile.
API-Beast,

hai ragione a farlo, ma immagino che la risposta sia molto più utile, specialmente per coloro che non sono forti nelle cose cos / sin, se inserisci lo pseudo-codice "ottimizzato" dopo la spiegazione teorica.
GameAlchemist,

Mi rendo conto che il codice qui non è ottimizzato, ma sembra che tu possa evitare la chiamata sqrt () sulla distanza, dal momento che lo usi immediatamente un momento dopo quadrandolo.
Kyle Baran,

2

mi sembra che ciò che viene disegnato siano segmenti, non punti. Quindi immagino che il Pozzo espelle un punto del cerchio, con un'alta velocità e un vettore di velocità tangente al cerchio. E un altro punto viene lanciato subito dopo, che è collegato al primo per disegnare un segmento. Quindi penso che le leggi della fisica (Newton) siano applicate con una forte gravità, il che spiega la diminuzione della velocità. Quindi suppongo che devi integrarti in tempo per farlo.

con: C il centro del pozzo, R il suo raggio.
P1 il punto che stiamo osservando come
K è una costante 'grande' che scegli con alcune prove (massa del pozzo).
vel0 è il vettore di velocità iniziale, tangenziale al cerchio.
vel0 deve essere alto (eseguire anche le prove)
pos0 la posizione iniziale, sul cerchio, al momento t0.
: d la distanza tra C e P1
: Vn il vettore normato 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   

Init: Il modo più semplice per generare un nuovo punto è scegliere un angolo A, quindi:

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

aggiornamento: per ogni iterazione devi calcolare:

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.     

non è necessario calcolare la velocità.
forse il gioco usa un certo tipo di attrito, quindi l'equazione sarebbe diversa.
nota che usi più volte cos (A) e sin (A), quindi conservali.

quindi se si generano molti punti collegati due per due e allo stesso tempo si cambia l'angolo iniziale A per far ruotare la sorgente del segmento attorno al pozzo, immagino che ti avvicini abbastanza alla soluzione.

Modifica: penso che dovresti provare prima senza attrito, potrebbe essere ok. l'attrito è una forza proporzionale alla velocità, ma che ha invertito la direzione del vettore. così l'equazione diventa:

    Acc = Gravity force + Friction Force.

con forza di attrito = - costante * Vel. questo non so come integrare, quindi vorrei fare un'integrazione graduale:

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

ci sarà un problema di stabilità numerica, ma poiché la durata delle particelle è breve, questo non dovrebbe essere un problema.


Cosa dovrebbe cambiare riguardo all'equazione sotto l'influenza dell'attrito? Ho un paio di soluzioni a questo problema, ma sono interessato a sentire le tue.
Mykel Stone,

0

Alla fine l'ho fatto, una replica soddisfacente del comportamento delle particelle.

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

L'effetto È un effetto di gravità standard con una torsione, quando le particelle rientrano in un certo intervallo viene applicata una forza sulla normale tangente. questo fa sì che le particelle "orbitino" in modo piuttosto instabile. Le particelle nello schizzo di elaborazione non si esauriscono, ma all'apice della loro orbita è quando si esauriscono e un altro gruppo viene rilasciato. Grazie a tutti per il vostro aiuto, anche se in realtà non mi ha fornito nuove informazioni, è molto apprezzato che tu abbia dedicato il tempo e lo sforzo che hai fatto alle tue risposte. Grazie ancora!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.