Jak wykonać efekt grawitacji Geometry Wars

11

Nie mówię tu o siatce tła, mówię o wirujących cząstkach krążących wokół studni grawitacyjnych! Zawsze lubiłem ten efekt i postanowiłem, że odtworzenie go będzie zabawnym eksperymentem. Wiem, że GW stosuje prawo Hooke'a wszędzie, ale nie sądzę, że efekt Particle-to-Well jest wykonywany za pomocą sprężyn, wygląda jak funkcja kwadratu odległości.

Oto wideo demonstrujące efekt: http://www.youtube.com/watch?v=YgJe0YI18Fg

Mogę dobrze wprowadzić efekt sprężystości lub grawitacji na niektóre cząstki, to proste. Ale nie mogę uzyskać efektu podobnego do efektu GW. Kiedy patrzę na efekt w grze, wydaje się, że cząsteczki są emitowane w pęczkach z samej Studni, spiralnie obracają się na zewnątrz dookoła centrum Studni i ostatecznie zostają odrzucone na zewnątrz, opadają w kierunku Studni i powtarzają się.

Jak sprawić, by cząstki spiralnie rozchodziły się na zewnątrz po spawnowaniu? Jak miałbym trzymać pęczki cząstek razem, gdy są blisko studni, ale oddalać się od siebie, gdy są one wyrzucane na zewnątrz? Jak utrzymałbym cząsteczki tak mocno związane ze studnią?

EDYCJA:
http://www.youtube.com/watch?v=1eEPl8kOXN8 <- Wideo
https://dl.dropbox.com/u/49283213/gw.gif <- GIF ścieżki cząstek

Wyłączyłem randomizację w GW, aby łatwiej było zobaczyć efekt cząsteczkowy, oto krótkie wideo, w którym widać niebiesko-zielony odpływ wysyłający wiązkę cząstek. Czerwone cząstki pochodzą z wybuchów, które normalnie pojawiają się w każdym miejscu. Kilka obserwacji, które poczyniłem z wideo:

  • Cząsteczki są emitowane ze środka (lub w pobliżu środka) odpływu
  • Wszystkie cząstki są zmuszane do ruchu w kierunku zgodnym z ruchem wskazówek zegara wokół środka, więc stosuje się jakiś ruch styczny, co można łatwo zobaczyć, gdy czerwone cząstki wybuchu zbliżają się do odpływu.
Mykel Stone
źródło

Odpowiedzi:

7

Z pokazanego wideo wydaje mi się, że to po prostu grawitacja. Większość ludzi myśli, że grawitacja sprawia, że ​​rzeczy lecą w dół, ale patrząc na to z bardziej odległej perspektywy, rzeczy latają eliptycznym lub spiralnym ruchem wokół centrum. Cząsteczki są zawsze przyspieszane w kierunku środka, jednak latają za nim, dopóki grawitacja nie zmusi go do powrotu. Niektóre cząstki latają tak daleko, że grawitacja nie wpływa już na nie tak bardzo i ostatecznie wypalają się przed zmianą ich kierunku.

Każda cząstka ma prędkość X i Y, do której dodaje się grawitację w zależności od kąta i odległości od środka. Grawitacja zawsze dodaje prędkości do kierunku (kąta) środka.

Tak więc dla cząsteczki: pozycja, prędkość
Dla studni grawitacyjnej masz: pozycję, siłę

Z pozycji można obliczyć kąt między cząstką a studnią grawitacyjną. Aby obliczyć kąt, potrzebujesz delty między dwiema współrzędnymi.

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

Ten kąt jest kątem wektora prędkości, który należy dodać.

Przyłożona siła zależy od odległości. Dokładniej zmniejsza się o kwadrat odległości. Więc jeśli coś jest dwa razy dalej, przykładana jest tylko jedna czwarta siły. Dla odległości wymagane są również delty.

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

Teraz masz siłę i kąt, którego potrzebujesz, aby je zastosować:

particle.velocity.x += force * sin(angle)
particle.velocity.y += force * cos(angle)
API-Beast
źródło
twoje rozwiązanie jest dość podobne do mojego, ale używa atan, sin, cos, sqrt, ... więc może być bardzo wolne. lepiej unikać części atan / sin / cos, zobacz mój post, aby zobaczyć jeden (może nie najlepszy) zrobić to szybciej.
GameAlchemist
Nie jest zoptymalizowany, więc jest lepiej zrozumiały.
API-Beast
masz rację, ale wydaje mi się, że odpowiedź jest o wiele bardziej przydatna, szczególnie dla tych, którzy nie są silni w cos / sin, jeśli wstawisz „zoptymalizowany” pseudokod po wyjaśnieniu teoretycznym.
GameAlchemist
Zdaję sobie sprawę, że kod tutaj nie jest zoptymalizowany, ale wydaje się , że można uniknąć wywołania sqrt () na odległość, ponieważ natychmiast używa się go chwilę później, podnosząc go do kwadratu.
Kyle Baran,
2

wydaje mi się, że narysowane są odcinki, a nie punkty. Sądzę więc, że studnia wyrzuca punkt koła z dużą prędkością i wektorem prędkości stycznym do koła. Zaraz potem rzucany jest kolejny punkt, który jest powiązany z pierwszym, który narysuje segment. Potem myślę, że prawa fizyki (Newton) są stosowane z silną grawitacją, co tłumaczy spadek prędkości. Myślę, że musisz to zrobić na czas, aby to zrobić.

z: C środkiem studni, R promieniem.
P1 punkt, w którym patrzymy na
K jako „dużą” stałą, którą wybierzesz w niektórych próbach (masa studni).
vel0 jest początkowym wektorem prędkości, stycznym do koła.
vel0 musi być wysokie (wykonać także próby)
pos0 początkową pozycję na kole w czasie t0.
: d odległość między C i P1
: Vn znormalizowany wektor 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: Najłatwiejszym sposobem na odrodzenie nowego punktu jest wybranie kąta A, a następnie:

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

aktualizacja: dla każdej iteracji musisz obliczyć:

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.     

nie trzeba obliczać prędkości.
może gra używa tarcia, wtedy równanie byłoby inne.
zauważ, że używasz kilka razy cos (A) i sin (A), więc przechowuj je.

więc jeśli spawnujesz wiele punktów połączonych dwa na dwa i jednocześnie zmieniasz początkowy kąt A, aby źródło segmentu obracało się wokół studni, to chyba zbliżasz się do rozwiązania.

Edycja: myślę, że powinieneś spróbować najpierw bez tarcia, może być w porządku. tarcie jest siłą proporcjonalną do prędkości, ale mającą odwrotny kierunek wektora. więc równanie staje się:

    Acc = Gravity force + Friction Force.

z siłą tarcia = - stała * Vel. tego nie wiem jak się zintegrować, więc wybrałbym krok po kroku integrację:

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

BĘDZIE pojawiał się problem stabilności numerycznej, ale ponieważ czas życia cząstek jest krótki, nie powinno to stanowić problemu.

GameAlchemist
źródło
Co musiałoby się zmienić w równaniu pod wpływem tarcia? Mam kilka rozwiązań tego problemu, ale chcę usłyszeć wasze.
Mykel Stone,
0

W końcu to zrobiłem, zadowalająca replikacja zachowania cząstek.

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

Efekt JEST standardowym efektem grawitacyjnym ze skrętem, gdy cząstki znajdą się w określonym zakresie, siła jest przyłożona do stycznej normalnej. powoduje to, że cząstki „krążą” w dość niestabilny sposób. Cząsteczki na szkicu przetwarzania nie wypalają się, ale na szczycie ich orbity wypalają się i uwalniana jest kolejna wiązka. Dziękuję wszystkim za twoją pomoc, nawet jeśli tak naprawdę nie dostarczyła mi żadnych nowych informacji, bardzo doceniamy to, że poświęciłeś swój czas i wysiłek na twoje odpowiedzi. Dzięki jeszcze raz!

Mykel Stone
źródło