ジオメトリウォーズの重力ウェルエフェクトの実行方法


11

ここでは背景グリッドについて話しているのではなく、重力ウェルの周りを回る渦巻き模様の粒子について話しているのです!私はいつもこのエフェクトが好きで、それを再現するのは楽しい実験だと思いました。GWは至る所でフックの法則を使用していることを知っていますが、Particle-to-Wellエフェクトはスプリングを使用して行われるとは思いません。距離の2乗関数のように見えます。

これは効果を示すビデオです:http : //www.youtube.com/watch?v=YgJe0YI18Fg

一部のパーティクルにスプリングまたは重力の効果をうまく実装できます。これは簡単です。しかし、効果がGW効果に似ているようには見えません。ゲームで効果を見ると、パーティクルはウェル自体から束状に放出され、ウェルの中心を中心に外向きにらせん状になり、最終的に外向きに飛ばされ、ウェルに向かって戻り、繰り返されるようです。

スポーン時にパーティクルを外側にらせん状にするにはどうすればよいですか?ウェルの近くにいるときにパーティクルの束を一緒に保ち、外側に飛ばすと互いに離れるようにするにはどうすればよいですか?粒子をウェルに強く付着させるにはどうすればよいですか?

編集:
http : //www.youtube.com/watch?
v =1eEPl8kOXN8 <-ビデオhttps://dl.dropbox.com/u/49283213/gw.gif <-パーティクルパスのGIF

パーティクルエフェクトをより見やすくするために、GW内のランダム化を無効にしました。これは、青緑色のドレインがパーティクルの束を送出しているのを見ることができる分のビデオです。赤い粒子は、通常その場所全体に現れる爆発からのものです。私がビデオから行ったいくつかの観察:

  • 粒子は、ドレインの中心(または中心付近)から放出されます
  • すべてのパーティクルが中心を中心に時計回りの動きをするように強制されているため、ある種の接線方向の動きが適用されています。赤い爆発のパーティクルが排水口に近づくと、これを簡単に確認できます。

回答:


7

ビデオから、それは私にとって単純な重力であるように見えました。ほとんどの人は重力が物を下向きに飛ばすと考えていますが、遠くから見ると、物は中心の周りで楕円形または螺旋状の動きで飛ぶようになります。粒子は常に中心に向かって加速されますが、重力がそれを何度も何度も強制的に戻すまで、それを超えて飛びます。一部のパーティクルは、重力がそれらにそれほど影響を及ぼさないほど遠くまで飛んで、方向を変える前に燃え尽きてしまいます。

各パーティクルにはXとYの速度があり、中心への角度と距離に応じて、各フレームに重力が追加されます。重力は常に中心の方向(角度)に速度を追加します。

だからあなたは粒子のために持っています:位置、速度
重力のためにあなたは持っています:位置、強さ

位置から、粒子と重力の間の角度をうまく計算できます。角度を計算するには、2つの座標間のデルタが必要です。

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

この角度は、追加する必要がある速度ベクトルの角度です。

適用される力の量は距離によって異なります。正確には、距離の2乗で減少します。したがって、何かが2倍離れている場合、4分の1の力しか加えられません。距離については、デルタも必要です。

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

これで、力と角度を適用するだけで済みます。

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

あなたの解決策は私のものと非常に似ていますが、それはatan、sin、cos、sqrtを使用するので、非常に遅くなる可能性があります。atan / sin / cosの部分は避けた方がいいです。私の投稿を参照してください(おそらく最善ではないかもしれません)。
GameAlchemist 2012

最適化されていないため、理解しやすくなっています。
API-Beast

あなたはそうする権利がありますが、理論的な説明の後に「最適化された」疑似コードを配置すると、答えははるかに役立ちます。
GameAlchemist 2012

私はここにコードが最適化されていません実現し、表示され、すぐにそれを二乗した瞬間、後でそれを使用するので、あなたは、距離上のsqrt()の呼び出しを避けることができるという。
Kyle Baran 14年

2

描かれているのは点ではなく線分であるように思えます。さて、私はウェルが円のポイントを排出し、高速で、速度ベクトルが円に接していると思います。そして、直後に別のポイントがスローされます。これは、セグメントを描画する最初のポイントにリンクされています。次に、物理法則(ニュートン)が強い重力で適用されていると思います。これは速度の低下を説明しています。したがって、これを行うには時間どおりに統合する必要があると思います。

with:Cウェルの中心、Rはその半径。
P1は、
Kがいくつかの試行(ウェルの質量)で選択する「大きな」定数であることを示しています。
vel0は、円に接する初期速度ベクトルです。
vel0は高くなければなりません(試行も行います)
pos0時間t0での円上の初期位置。
:d CとP1の間の距離
:Vnノルムベクトル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:新しいポイントをスポーンする最も簡単な方法は、角度Aを選択することです。

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

更新:計算する必要がある反復ごとに

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.     

速度を計算する必要はありません。
多分ゲームは何らかの摩擦を使用しているので、方程式は異なります。
cos(A)とsin(A)を数回使用していることに注意してください。

したがって、2つずつリンクされた多くのポイントをスポーンし、同時に初期角度Aを変更して、セグメントソースをウェルの周りで回転させると、おそらくソリューションからかなり近づきます。

編集:私はあなたが最初に摩擦なしでこれを試すべきであると思います、それは大丈夫かもしれません。摩擦は速度に比例する力ですが、ベクトル方向が逆になります。したがって、方程式は次のようになります。

    Acc = Gravity force + Friction Force.

摩擦力=-定数*速度 これは統合する方法がわからないので、段階的に統合します。

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

数値の安定性の問題がありますが、粒子の寿命が短いため、これは問題にはなりません。


摩擦の影響下で方程式について何を変更する必要がありますか?この問題にはいくつかの解決策がありますが、あなたの話を聞きたいです。
Mykel Stone 2012

0

私はついにそれを行いました、粒子の振る舞いの十分な複製です。

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

この効果は、ひねりを加えた標準的な重力効果です。粒子が特定の範囲内に入ると、接線法線に力が適用されます。これにより、パーティクルはかなり不安定な方法で「軌道を回る」ようになります。処理スケッチ内のパーティクルは燃え尽きませんが、軌道の頂点では、これが燃え尽きて別の束が解放されるときです。本当にありがとうございました。たとえ新しい情報を提供してくれなかったとしても、時間と労力を費やして回答に感謝します。再度、感謝します!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.