Wie man den Geometry Wars Gravitationseffekt macht


11

Ich spreche hier nicht über das Hintergrundgitter, ich spreche über die wirbelnden Partikel, die um die Schwerkraftbrunnen herumlaufen! Ich habe den Effekt immer gemocht und beschlossen, dass es ein lustiges Experiment wäre, ihn zu replizieren. Ich weiß, dass GW überall das Hookesche Gesetz anwendet, aber ich glaube nicht, dass der Partikel-zu-Brunnen-Effekt mit Federn erzielt wird sieht aus wie eine Distanz-Quadrat-Funktion.

Hier ist ein Video, das den Effekt demonstriert: http://www.youtube.com/watch?v=YgJe0YI18Fg

Ich kann einen Feder- oder Schwerkrafteffekt auf einige Partikel anwenden, das ist ganz einfach. Aber ich kann nicht scheinen, dass der Effekt dem GW-Effekt ähnelt. Wenn ich den Effekt im Spiel beobachte, scheint es, dass die Partikel in Bündeln vom Brunnen selbst emittiert werden, sich um die Mitte des Brunnens nach außen drehen und schließlich nach außen geschleudert werden, zum Brunnen zurückfallen und wiederholen.

Wie würde ich die Partikel beim Laichen nach außen drehen lassen? Wie würde ich die Partikelbündel in der Nähe des Brunnens zusammenhalten, aber voneinander wegstreuen, wenn sie nach außen geschleudert werden? Wie würde ich die Partikel so stark am Brunnen halten?

BEARBEITEN:
http://www.youtube.com/watch?v=1eEPl8kOXN8 <- Video
https://dl.dropbox.com/u/49283213/gw.gif <- GIF des Partikelpfads

Ich habe die Randomisierung innerhalb von GW deaktiviert, um den Partikeleffekt besser sichtbar zu machen. Hier ist ein winziges Video, in dem Sie einen blaugrünen Abfluss sehen können, der seine Partikelbündel aussendet. Die roten Partikel stammen von den Explosionen, die normalerweise überall auftreten. Einige Beobachtungen, die ich aus dem Video gemacht habe:

  • Die Partikel werden von der Mitte (oder nahe der Mitte) des Abflusses emittiert
  • Alle Partikel werden in eine Bewegung im Uhrzeigersinn um das Zentrum gezwungen, so dass eine tangentiale Bewegung angewendet wird. Sie können dies leicht erkennen, wenn sich die roten Explosionspartikel dem Abfluss nähern.

Antworten:


7

Aus dem Video geht hervor, dass es für mich einfach nur Schwerkraft zu sein scheint. Die meisten Menschen denken, dass die Schwerkraft die Dinge nach unten fliegen lässt, aber wenn man sie aus einer weiter entfernten Perspektive betrachtet, fliegen die Dinge in einer elliptischen oder spiralförmigen Bewegung um das Zentrum. Die Partikel werden immer in Richtung Zentrum beschleunigt, fliegen jedoch darüber hinaus, bis die Schwerkraft sie zwingt, immer wieder zurückzukehren. Einige Partikel fliegen so weit, dass die Schwerkraft sie nicht mehr so ​​stark beeinflusst und am Ende ausbrennt, bevor sie ihre Richtung ändern.

Jedes Teilchen hat eine X- und Y-Geschwindigkeit, zu der jedem Rahmen die Schwerkraft hinzugefügt wird, abhängig vom Winkel und Abstand zum Zentrum. Die Schwerkraft addiert immer Geschwindigkeit in die Richtung (Winkel) des Zentrums.

Sie haben also für das Teilchen: Position, Geschwindigkeit
Für die Schwerkraft haben Sie: Position, Stärke

Aus den Positionen können Sie den Winkel zwischen dem Partikel und der Schwerkraftbohrung berechnen. Um den Winkel zu berechnen, benötigen Sie die Deltas zwischen den beiden Koordinaten.

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

Dieser Winkel ist der Winkel des Geschwindigkeitsvektors, der hinzugefügt werden muss.

Die Kraft, die angewendet wird, hängt von der Entfernung ab. Um genau zu sein, nimmt es um das Quadrat der Entfernung ab. Wenn also etwas doppelt so weit entfernt ist, wird nur ein Viertel der Kraft angewendet. Für die Entfernung werden auch die Deltas benötigt.

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

Jetzt haben Sie die Kraft und den Winkel, die Sie nur noch benötigen, um sie anzuwenden:

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

Ihre Lösung ist meiner ziemlich ähnlich, verwendet jedoch atan, sin, cos, sqrt, ... so dass es sehr langsam werden kann. Es ist besser, den Teil atan / sin / cos zu vermeiden. Siehe meinen Beitrag, um einen (vielleicht nicht den besten) schneller zu erledigen.
GameAlchemist

Es ist nicht optimiert, daher ist es besser verständlich.
API-Beast

Sie haben Recht, aber ich denke, die Antwort ist viel nützlicher, insbesondere für diejenigen, die nicht stark in cos / sin-Dingen sind, wenn Sie den 'optimierten' Pseudocode nach der theoretischen Erklärung setzen.
GameAlchemist

Mir ist klar, dass der Code hier nicht optimiert ist, aber es scheint, dass Sie den Aufruf von sqrt () für die Entfernung vermeiden können, da Sie ihn einen Moment später sofort verwenden, indem Sie ihn quadrieren.
Kyle Baran

2

es scheint mir, dass gezeichnet werden Segmente, keine Punkte. Ich denke also, der Brunnen wirft einen Punkt des Kreises aus, mit einer hohen Geschwindigkeit und einem Geschwindigkeitsvektor, der den Kreis tangiert. Und gleich danach wird ein weiterer Punkt geworfen, der mit dem ersten verknüpft ist, der ein Segment zeichnet. Dann denke ich, dass Gesetze der Physik (Newton) mit einer starken Schwerkraft angewendet werden, was den Geschwindigkeitsabfall erklärt. Ich denke, Sie müssen sich rechtzeitig integrieren, um dies zu tun.

mit: C der Mitte des Brunnens, R seinem Radius.
P1 der Punkt, an dem wir
K als 'große' Konstante betrachten, die Sie bei einigen Versuchen wählen (Masse des Brunnens).
vel0 ist der anfängliche Geschwindigkeitsvektor, tangential zum Kreis.
vel0 muss hoch sein (auch Versuche durchführen)
und die Ausgangsposition auf dem Kreis zum Zeitpunkt t0 einnehmen.
: d der Abstand zwischen C und P1
: Vn der normierte Vektor 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: Der einfachste Weg, um einen neuen Punkt zu erzeugen, besteht darin, einen Winkel A zu wählen und dann:

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

Update: Für jede Iteration müssen Sie Folgendes berechnen:

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.     

Geschwindigkeit muss nicht berechnet werden.
Vielleicht verwendet das Spiel eine Art Reibung, dann wäre die Gleichung anders.
Beachten Sie, dass Sie cos (A) und sin (A) mehrmals verwenden. Speichern Sie sie daher.

Wenn Sie also viele Punkte erzeugen, die zwei mal zwei miteinander verbunden sind, und gleichzeitig den Anfangswinkel A ändern, damit sich die Segmentquelle um das Bohrloch dreht, kommen Sie der Lösung, denke ich, ziemlich nahe.

Bearbeiten: Ich denke, Sie sollten dies zuerst ohne Reibung versuchen, es könnte in Ordnung sein. Reibung ist eine Kraft, die proportional zur Geschwindigkeit ist, aber eine umgekehrte Vektorrichtung aufweist. so wird die Gleichung:

    Acc = Gravity force + Friction Force.

mit Reibungskraft = - konstant * Vel. Ich weiß nicht, wie ich mich integrieren soll, also würde ich mich Schritt für Schritt für die Integration entscheiden:

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

Es wird ein Problem mit der numerischen Stabilität geben, aber da die Lebensdauer der Partikel kurz ist, sollte dies kein Problem sein.


Was müsste sich an der Gleichung unter dem Einfluss von Reibung ändern? Ich habe ein paar Lösungen für dieses Problem, aber ich bin interessiert, Ihre zu hören.
Mykel Stone

0

Ich habe es endlich geschafft, eine zufriedenstellende Nachbildung des Partikelverhaltens.

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

Der Effekt ist ein Standard-Schwerkrafteffekt mit einer Verdrehung, wenn die Partikel in einen bestimmten Bereich gelangen, wird eine Kraft auf die Tangentennormale ausgeübt. Dies führt dazu, dass die Partikel auf ziemlich instabile Weise "umkreisen". Die Partikel in der Verarbeitungsskizze brennen nicht aus, aber an der Spitze ihrer Umlaufbahn würden sie ausbrennen und ein weiteres Bündel würde freigesetzt. Vielen Dank für Ihre Hilfe, auch wenn sie mir nicht wirklich neue Informationen geliefert hat. Es wird sehr geschätzt, dass Sie die Zeit und Mühe, die Sie getan haben, in Ihre Antworten gesteckt haben. Danke noch einmal!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.