Geometri Savaşları yerçekimi kuyu etkisi nasıl yapılır


11

Burada arka plan ızgarasından bahsetmiyorum, Gravity Wells'in etrafında dönen girdap parçacıklarından bahsediyorum! Etkiyi her zaman sevdim ve çoğaltmanın eğlenceli bir deney olacağına karar verdim, GW'nin Hooke yasasını her yerde kullandığını biliyorum, ama Parçacık-Kuyu etkisinin yaylar kullanılarak yapıldığını düşünmüyorum, mesafe kare fonksiyonuna benziyor.

Etkisini gösteren bir video: http://www.youtube.com/watch?v=YgJe0YI18Fg

Bazı parçacıklara bir yay veya yerçekimi etkisi uygulayabilirim, bu kolay. Ancak GWs efektine benzer bir etki elde edemiyorum. Oyunda etkiyi izlediğimde, parçacıkların Kuyunun kendisinden demet halinde yayıldığı anlaşılıyor, kuyu merkezinin etrafında dışarı doğru sarılıyorlar ve sonunda dışa doğru fırlıyorlar, kuyuya geri düşüyorlar ve tekrar ediyorlar.

Yumurtlandıklarında parçacıkların nasıl spiral olmasını sağlarım? Parçacık demetlerini Kuyu yakınındayken nasıl bir arada tutarım, ancak dışarı doğru fırlatıldıklarında birbirlerinden uzaklaşırım? Parçacıkları kuyuya bu kadar güçlü bir şekilde nasıl bağlayabilirim?

DÜZENLEME:
http://www.youtube.com/watch?v=1eEPl8kOXN8 <- Video
https://dl.dropbox.com/u/49283213/gw.gif <- Parçacık yolunun GIF'i

Parçacık efektinin daha kolay görülmesini sağlamak için GW içindeki randomizasyonu devre dışı bıraktım, işte mavi-yeşil bir drenajın parçacıklar demetini gönderdiğini görebileceğiniz bir dakika videosu. Kırmızı parçacıklar normalde her yerde görülen patlamalardan gelir. Videodan yaptığım bazı gözlemler:

  • Parçacıklar giderin merkezinden (veya merkezinden yakın) yayılır
  • Tüm parçacıklar merkez etrafında saat yönünde bir harekete zorlanıyor, böylece bir çeşit teğetsel hareket uygulanıyor, kırmızı patlama parçacıkları tahliyeye yaklaştığında bunu kolayca görebilirsiniz.

Yanıtlar:


7

Videodan bana göre sadece yerçekimi gibi görünüyor. Çoğu insan, yerçekiminin şeyleri aşağıya doğru uçurduğunu düşünür, ancak daha uzak bir perspektiften bakıldığında, şeylerin merkez çevresinde eliptik veya spiral bir hareketle uçmasını sağlar. Parçacıklar her zaman merkeze doğru hızlanır, ancak yerçekimi onu tekrar tekrar gelmeye zorlayana kadar ötesine uçar. Bazı parçacıklar o kadar uçarlar ki yerçekimi artık onları çok fazla etkilemez ve yönlerini değiştirmeden önce yanar.

Her parçacık, merkeze olan açıya ve mesafeye bağlı olarak, yerçekiminin her çerçevesine eklendiği bir X ve Y hızına sahiptir. Yerçekimi daima merkezin yönüne (açısına) hız ekler.

Yani parçacık için var: konum, hız
Yerçekimi kuyusu için: konum, güç

Pozisyonlardan, parçacık ve yerçekimi kuyusu arasındaki açıyı hesaplayabilirsiniz. Açıyı hesaplamak için iki koordinat arasındaki deltalara ihtiyacınız olacaktır.

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

Bu açı, eklenmesi gereken hız vektörünün açısıdır.

Uygulanan kuvvet miktarı mesafeye bağlıdır. Tam olarak, mesafenin karesi azalır. Yani eğer bir şey iki kat daha uzaktaysa, sadece dörtte bir kuvvet uygulanır. Mesafe için deltalar da gereklidir.

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

Şimdi bunları uygulamak için ihtiyacınız olan güç ve açıya sahipsiniz:

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

çözümünüz benimkine oldukça benziyor, ama atan, sin, cos, sqrt, ... kullanıyor, bu yüzden çok yavaşlayabilir. atan / sin / cos kısmından kaçınmak daha iyidir, daha hızlı bir şekilde yapmak için yazıma bakın (belki de en iyisi değil).
GameAlchemist

Optimize edilmediğinden daha iyi anlaşılabilir.
API-Beast

Bunu yapmakta haklısınız, ancak teorik açıklamadan sonra 'optimize edilmiş' sözde kodu koyarsanız, cevabın özellikle cos / sin şeylerinde güçlü olmayanlar için çok daha fazla kullanımı olduğunu düşünüyorum.
GameAlchemist

Buradaki kodun optimize edilmediğini anlıyorum, ancak sqrt () çağrısından kaçınabileceğiniz gibi görünüyor , çünkü kareyi bir an sonra kullanıyorsunuz.
Kyle Baran

2

Bana öyle geliyor ki, çizilen şey noktalar değil bölümler. Yani sanırım Kuyu dairenin bir noktasını, yüksek hız ve daireye teğet bir hız vektörü ile atıyor. Ve hemen sonra başka bir nokta atılır, bu da bir segment çizen ilk noktaya bağlanır. Sonra fizik yasalarının (Newton) güçlü bir yerçekimi ile uygulandığını düşünüyorum, bu da hız düşüşünü açıklıyor. Sanırım bunu yapmak için zamanında entegre olmalısınız.

ile: C kuyunun merkezi, R yarıçapı.
P1,
K'nin bazı denemelerle (kuyu kütlesi) seçtiğiniz 'büyük' ​​bir sabit olduğuna baktığımız nokta .
vel0 daireye teğet olan ilk hız vektörüdür.
vel0 yüksek olmalıdır (denemeler de yapın)
, t0 zamanında daire üzerinde başlangıç ​​pozisyonunu oluşturur.
: d C ve P1 arasındaki mesafe
: Vn normlu vektörü P 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: Yeni bir noktaya çıkmanın en kolay yolu A açısını seçmektir:

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

güncelleme: her yineleme için hesaplamanız gerekir:

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.     

hız hesaplamaya gerek yok.
belki oyun bir tür sürtünme kullanırsa, denklem farklı olurdu.
cos (A) ve sin (A) 'yı birkaç kez kullandığınıza dikkat edin, saklayın.

bu yüzden ikişer ikişer bağlantılı bir çok nokta ortaya çıkarırsanız ve aynı zamanda segment kaynağının kuyunun etrafında dönmesi için başlangıç ​​açısını A değiştirirseniz, sanırım çözümden oldukça yakınsınız demektir.

Düzenleme: Ben ilk sürtünme olmadan bunu denemek gerektiğini düşünüyorum, Tamam olabilir. sürtünme, hız ile orantılı olan ancak tersine vektör yönüne sahip bir kuvvettir. böylece denklem şöyle olur:

    Acc = Gravity force + Friction Force.

Sürtünme Kuvveti ile = - sabit * Vel. Bu nasıl entegre edeceğimi bilmiyorum, bu yüzden adım adım entegrasyon için gitmek istiyorum:

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

sayısal kararlılık sorunu olacak, ancak partiküllerin ömrü kısa olduğu için bu bir sorun olmamalıdır.


Sürtünmenin etkisi altındaki denklem hakkında ne değiştirmek gerekir? Bu konuda birkaç çözümüm var ama sizinkini duymak istiyorum.
Mykel Taş

0

Sonunda, parçacık davranışının tatmin edici bir kopyasını yaptım.

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

Etki, bir bükülme ile standart bir yerçekimi etkisidir, parçacıklar belirli bir aralığa girdiğinde teğet normaline bir kuvvet uygulanır. bu, partiküllerin oldukça kararsız bir şekilde "yörüngesine" neden olur. İşleme çizimindeki parçacıklar yanmaz, ancak yörüngelerinin tepesinde bu yanar ve başka bir demet serbest bırakılır. Yardımlarınız için hepinize teşekkürler, bana gerçekten yeni bir bilgi vermese bile, cevaplarınıza harcadığınız zamanı ve çabayı göstermeniz çok takdir edilmektedir. Tekrar teşekkürler!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.