Cara melakukan efek gravitasi Geometry Wars dengan baik

11

Saya tidak berbicara tentang grid latar belakang di sini, saya berbicara tentang partikel yang berputar di sekitar Gravity Wells! Saya selalu menyukai efeknya dan memutuskan itu akan menjadi percobaan yang menyenangkan untuk menggandakannya, saya tahu GW menggunakan hukum Hooke di semua tempat, tapi saya tidak berpikir efek Partikel-ke-Sumur dilakukan menggunakan pegas, itu tampak seperti fungsi jarak-kuadrat.

Berikut adalah video yang menunjukkan efeknya: http://www.youtube.com/watch?v=YgJe0YI18Fg

Saya dapat menerapkan efek pegas atau gravitasi pada beberapa partikel dengan baik, itu mudah. Tapi sepertinya saya tidak bisa mendapatkan efek yang terlihat mirip dengan efek GW. Ketika saya melihat efeknya dalam permainan, tampaknya partikel-partikel itu dipancarkan dalam tandan dari Sumur itu sendiri, mereka berputar keluar di sekitar pusat sumur, dan akhirnya terlempar ke luar, jatuh kembali ke sumur, dan ulangi.

Bagaimana saya membuat partikel spiral ke luar ketika melahirkan? Bagaimana saya bisa menjaga tandan partikel bersama ketika dekat Sumur tetapi menyebar dari satu sama lain ketika mereka terlempar keluar? Bagaimana cara saya menjaga agar partikel tetap melekat kuat di Sumur?

EDIT:
http://www.youtube.com/watch?v=1eEPl8kOXN8 <- Video
https://dl.dropbox.com/u/49283213/gw.gif <- GIF dari jalur partikel

Saya menonaktifkan pengacakan dalam GW untuk membuat efek partikel lebih mudah dilihat, inilah video menit di mana Anda dapat melihat saluran biru-hijau mengirimkan sekelompok partikelnya. Partikel merah berasal dari ledakan yang biasanya muncul di semua tempat. Beberapa pengamatan yang saya lakukan dari video:

  • Partikel-partikel dipancarkan dari pusat (atau dekat pusat) saluran pembuangan
  • Semua partikel dipaksa menjadi gerakan searah jarum jam di sekitar pusat sehingga semacam gerakan tangensial sedang diterapkan, Anda dapat dengan mudah melihat ini ketika partikel ledakan merah mendekati saluran pembuangan.
Mykel Stone
sumber

Jawaban:

7

Dari video menunjukkan sepertinya gravitasi bagi saya. Kebanyakan orang berpikir gravitasi membuat benda-benda terbang ke bawah, tetapi dengan melihatnya dari sudut pandang yang lebih jauh, ia membuat benda-benda terbang dengan gerakan berbentuk elips atau spiral di sekitar pusat. Partikel-partikel selalu dipercepat menuju pusat, namun terbang melewatinya hingga gravitasi memaksanya untuk kembali, lagi dan lagi. Beberapa partikel terbang sejauh itu sehingga gravitasi tidak terlalu memengaruhi mereka dan akhirnya terbakar sebelum mengubah arahnya.

Setiap partikel memiliki kecepatan X dan Y, di mana setiap frame gravitasi ditambahkan, tergantung pada sudut dan jarak ke pusat. Gravitasi selalu menambah kecepatan ke arah (sudut) pusat.

Jadi yang Anda miliki untuk partikel: posisi, kecepatan
Untuk gravitasi yang Anda miliki: posisi, kekuatan

Dari posisi Anda dapat menghitung sudut antara partikel dan gravitasi dengan baik. Untuk menghitung sudut, Anda perlu delta di antara dua koordinat.

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

Sudut ini adalah sudut vektor kecepatan yang perlu ditambahkan.

Jumlah gaya yang diterapkan tergantung pada jarak. Tepatnya berkurang dengan kuadrat jarak. Jadi, jika sesuatu dua kali lebih jauh, hanya kekuatan keempat yang diterapkan. Untuk jarak, delta juga diperlukan.

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

Sekarang Anda memiliki kekuatan dan sudut yang Anda hanya perlu menerapkannya:

particle.velocity.x += force * sin(angle)
particle.velocity.y += force * cos(angle)
API-Beast
sumber
solusi Anda sangat mirip dengan saya, tetapi menggunakan atan, sin, cos, sqrt, ... sehingga mungkin menjadi sangat lambat. lebih baik untuk menghindari bagian atan / sin / cos, lihat posting saya ke se satu (mungkin bukan yang terbaik) lakukan untuk itu lebih cepat.
GameAlchemist
Ini tidak dioptimalkan sehingga lebih mudah dimengerti.
API-Beast
Anda benar untuk melakukannya, tetapi saya kira jawabannya adalah lebih banyak digunakan, terutama bagi mereka yang tidak kuat dalam hal-hal cos / sin, jika Anda meletakkan pseudo-code 'dioptimalkan' setelah penjelasan teoretis.
GameAlchemist
Saya menyadari bahwa kode di sini tidak dioptimalkan, tetapi tampaknya Anda dapat menghindari panggilan sqrt () dari kejauhan, karena Anda segera menggunakannya sesaat kemudian dengan mengkuadratkannya.
Kyle Baran
2

bagi saya tampaknya apa yang digambar adalah segmen, bukan poin. Jadi saya kira Sumur mengeluarkan titik lingkaran, dengan kecepatan tinggi dan vektor kecepatan bersinggungan dengan lingkaran. Dan titik lain dilemparkan setelah itu, yang terkait dengan yang pertama untuk menggambar segmen. Lalu saya pikir hukum fisika (Newton) diterapkan dengan gravitasi yang kuat, yang menjelaskan penurunan kecepatan. Jadi saya kira Anda harus berintegrasi tepat waktu untuk melakukan ini.

dengan: C pusat sumur, R jari-jarinya.
P1 poin yang kita lihat di
K adalah konstanta 'besar' yang Anda pilih dengan beberapa percobaan (massa sumur).
vel0 adalah vektor kecepatan awal, tangensial ke lingkaran.
vel0 harus tinggi (lakukan uji coba juga)
pos0 posisi awal, pada lingkaran, pada waktu t0.
: d jarak antara C dan P1
: Vn vektor normed 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: Cara termudah untuk menelurkan titik baru adalah dengan memilih sudut A, lalu:

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

pembaruan: untuk setiap iterasi Anda harus menghitung:

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.     

tidak perlu menghitung kecepatan.
mungkin gamenya menggunakan semacam gesekan, maka persamaannya akan berbeda.
perhatikan bahwa Anda menggunakan beberapa kali cos (A) dan sin (A), jadi simpanlah.

jadi jika Anda menelurkan banyak titik yang dihubungkan dua demi dua dan pada saat yang sama Anda mengubah sudut awal A agar sumber segmen berputar di sekitar sumur, Anda mendekati solusi saya kira.

Sunting: saya pikir Anda harus mencoba ini tanpa gesekan terlebih dahulu, mungkin ok. gesekan adalah gaya yang proporsional dengan kecepatan, tetapi memiliki arah vektor terbalik. jadi persamaannya menjadi:

    Acc = Gravity force + Friction Force.

dengan Gaya Gesekan = - konstan * Vel. ini saya tidak tahu bagaimana mengintegrasikan, jadi saya akan pergi untuk langkah demi langkah integrasi:

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

akan ada masalah stabilitas numerik, tetapi karena masa hidup partikel pendek, ini seharusnya tidak menjadi masalah.

GameAlchemist
sumber
Apa yang harus diubah tentang persamaan di bawah pengaruh gesekan? Saya punya beberapa solusi untuk masalah itu, tetapi saya tertarik mendengarnya.
Batu Mykel
0

Saya akhirnya melakukannya, replikasi perilaku partikel yang memuaskan.

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

Efeknya IS efek gravitasi standar dengan twist, ketika partikel masuk dalam kisaran tertentu gaya diterapkan pada tangen normal. ini menyebabkan partikel "mengorbit" dengan cara yang agak tidak stabil. Partikel-partikel dalam sketsa pemrosesan tidak terbakar, tetapi pada puncak orbitnya inilah saat mereka akan terbakar dan gugusan lainnya akan dilepaskan. Terima kasih atas bantuan Anda, bahkan jika itu tidak benar-benar memberi saya informasi baru, sangat dihargai bahwa Anda akan meluangkan waktu dan upaya yang Anda lakukan dalam jawaban Anda. Terima kasih lagi!

Mykel Stone
sumber