Cómo hacer el efecto de pozo de gravedad de Geometry Wars

11

¡No estoy hablando de la cuadrícula de fondo aquí, estoy hablando de las partículas de remolino que circulan por los Pozos de gravedad! Siempre me ha gustado el efecto y decidí que sería un experimento divertido replicarlo, sé que GW usa la ley de Hooke por todas partes, pero no creo que el efecto de Partícula a Pozo se haga usando resortes, parece una función de distancia al cuadrado.

Aquí hay un video que demuestra el efecto: http://www.youtube.com/watch?v=YgJe0YI18Fg

Puedo implementar un efecto de resorte o gravedad en algunas partículas muy bien, eso es fácil. Pero parece que no puedo lograr que el efecto se parezca al efecto de GW. Cuando veo el efecto en el juego, parece que las partículas se emiten en racimos desde el Pozo mismo, giran en espiral alrededor del centro del pozo, y eventualmente se arrojan hacia afuera, caen hacia el pozo y repiten.

¿Cómo haría que las partículas giraran en espiral hacia afuera cuando se generan? ¿Cómo mantendría los racimos de partículas juntos cuando estuviese cerca del Pozo y me separara cuando se arrojen hacia afuera? ¿Cómo mantendría las partículas tan fuertemente unidas al Pozo?

EDITAR:
http://www.youtube.com/watch?v=1eEPl8kOXN8 <- Video
https://dl.dropbox.com/u/49283213/gw.gif <- GIF de la ruta de partículas

Desactivé la aleatorización dentro de GW para que el efecto de partículas sea más fácil de ver, aquí hay un video de un minuto donde puedes ver un drenaje azul-verde enviando su montón de partículas. Las partículas rojas son de las explosiones que normalmente aparecen en todo el lugar. Algunas observaciones que hice del video:

  • Las partículas se emiten desde el centro (o cerca del centro) del drenaje
  • Todas las partículas están siendo forzadas en un movimiento en el sentido de las agujas del reloj alrededor del centro, por lo que se está aplicando algún tipo de movimiento tangencial, puede verlo fácilmente cuando las partículas de explosión rojas se acercan al drenaje.
Piedra de mykel
fuente

Respuestas:

7

Según el video que se muestra, parece ser una simple gravedad para mí. La mayoría de la gente piensa que la gravedad hace que las cosas vuelen hacia abajo, pero al mirarla desde una perspectiva más lejana, hace que las cosas vuelen en un movimiento elíptico o en espiral alrededor del centro. Las partículas siempre se aceleran hacia el centro, sin embargo vuelan más allá de él hasta que la gravedad lo obliga a regresar, una y otra vez. Algunas partículas vuelan tan lejos que la gravedad ya no las afecta tanto y terminan quemándose antes de cambiar su dirección.

Cada partícula tiene una velocidad X e Y, a la cual se agrega la gravedad a cada cuadro, dependiendo del ángulo y la distancia al centro. La gravedad siempre agrega velocidad en la dirección (ángulo) del centro.

Entonces tienes para la partícula: posición, velocidad
Para el pozo de gravedad tienes: posición, fuerza

A partir de las posiciones, puede calcular el ángulo entre la partícula y el pozo de gravedad. Para calcular el ángulo necesitarás los deltas entre las dos coordenadas.

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

Este ángulo es el ángulo del vector de velocidad que debe agregarse.

La cantidad de fuerza que se aplica depende de la distancia. Para ser exactos, disminuye por el cuadrado de la distancia. Entonces, si algo está dos veces más lejos, solo se aplica un cuarto de fuerza. Para la distancia también se requieren los deltas.

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

Ahora tiene la fuerza y ​​el ángulo que necesita para aplicarlos:

particle.velocity.x += force * sin(angle)
particle.velocity.y += force * cos(angle)
API-Bestia
fuente
su solución es bastante similar a la mía, pero usa atan, sin, cos, sqrt, ... por lo que puede ser muy lenta. es mejor evitar la parte de atan / sin / cos, mira mi publicación para ver uno (quizás no el mejor) hacerlo más rápido.
GameAlchemist
No está optimizado, por lo que es mejor comprensible.
API-Beast
tiene razón al hacerlo, pero supongo que la respuesta es mucho más útil, especialmente para aquellos que no son fuertes en las cosas cos / sin, si coloca el pseudocódigo 'optimizado' después de la explicación teórica.
GameAlchemist
Me doy cuenta de que el código aquí no está optimizado, pero parece que puede evitar la llamada sqrt () en la distancia, ya que lo usa inmediatamente un momento después cuadrándolo.
Kyle Baran
2

Me parece que lo que se dibuja son segmentos, no puntos. Así que supongo que el pozo expulsa un punto del círculo, con una velocidad alta y un vector de velocidad tangente al círculo. Y se lanza otro punto justo después, que está vinculado al primero para dibujar un segmento. Entonces creo que las leyes de la física (Newton) se aplican con una fuerte gravedad, lo que explica la disminución de la velocidad. Así que supongo que tienes que integrarte a tiempo para hacer esto.

con: C el centro del pozo, R su radio.
P1, el punto que estamos viendo es que
K es una constante 'grande' que usted elige con algunas pruebas (masa del pozo).
vel0 es el vector de velocidad inicial, tangencial al círculo.
vel0 debe ser alto (hacer pruebas también)
pos0 la posición inicial, en el círculo, en el tiempo t0.
: d la distancia entre C y P1
: Vn el vector normado 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: La forma más fácil de generar un nuevo punto es elegir un ángulo A, luego:

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

actualización: para cada iteración tienes que 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.     

No es necesario calcular la velocidad.
tal vez el juego use algún tipo de fricción, entonces la ecuación sería diferente.
observe que usa varias veces cos (A) y sin (A), así que guárdelos.

así que si genera muchos puntos vinculados de dos en dos y al mismo tiempo cambia el ángulo inicial A para que la fuente del segmento gire alrededor del pozo, supongo que se acercará bastante a la solución.

Editar: creo que deberías probar esto sin fricción primero, podría estar bien. La fricción es una fuerza que es proporcional a la velocidad, pero que tiene una dirección inversa del vector. entonces la ecuación se convierte en:

    Acc = Gravity force + Friction Force.

con fuerza de fricción = - constante * Vel. no sé cómo integrarlo, así que iría por una integración paso a paso:

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

Habrá un problema de estabilidad numérica, pero dado que el tiempo de vida de las partículas es corto, esto no debería ser un problema.

GameAlchemist
fuente
¿Qué tendría que cambiar sobre la ecuación bajo la influencia de la fricción? Tengo un par de soluciones a ese problema, pero estoy interesado en escuchar la suya.
Mykel Stone
0

Finalmente lo hice, una réplica satisfactoria del comportamiento de las partículas.

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

El efecto ES un efecto de gravedad estándar con un giro, cuando las partículas se encuentran dentro de un cierto rango, se aplica una fuerza en la tangente normal. Esto hace que las partículas "orbiten" de una manera bastante inestable. Las partículas en el bosquejo de procesamiento no se queman, pero en la cúspide de su órbita es cuando se quemarían y se liberaría otro grupo. Gracias a todos por su ayuda, incluso si realmente no me proporcionó ninguna información nueva, es muy apreciado que pusieran el tiempo y el esfuerzo que hicieron en sus respuestas. ¡Gracias de nuevo!

Piedra de mykel
fuente