如何做几何大战引力效果好


11

我不是在这里谈论背景网格,而是在重力井周围旋转的漩涡状粒子!我一直很喜欢这种效果,并决定将其复制是一个有趣的实验,我知道GW到处都使用胡克定律,但是我不认为使用弹簧来完成“粒子到井”效果,它看起来像是距离平方函数。

这是演示效果的视频:http : //www.youtube.com/watch?v=YgJe0YI18Fg

我可以对某些粒子实施弹簧或重力作用,这很容易。但是我似乎无法获得类似于GWs效果的效果。当我观察游戏中的效果时,似乎粒子是从井自身发出的,是成束的,它们围绕井的中心向外螺旋旋转,最终被扔向井外,向井后退,然后重复。

生成时如何使粒子向外螺旋?在井附近时,我如何将粒子束保持在一起,而当它们向外抛出时,它们如何彼此分开扩散?我如何使颗粒牢固地附着在井上?

编辑:
http : //www.youtube.com/watch
?v= 1eEPl8kOXN8 <-视频https://dl.dropbox.com/u/49283213/gw.gif <-粒子路径的GIF

我禁用了GW中的随机化功能,以使粒子效果更容易看清,这是一个分钟的视频,您可以看到蓝绿色的排水孔散发出一堆粒子。红色粒子来自通常在各处出现的爆炸。我从视频中得出的一些观察结果:

  • 粒子从排水管的中心(或中心附近)发射
  • 所有粒子都被迫绕着中心沿顺时针方向运动,因此应用了某种切向运动,当红色爆炸粒子接近排水口时,您可以轻松地看到这一点。

Answers:


7

从视频中可以看出,对我来说,这似乎只是个简单的引力。大多数人认为重力会使物体向下飞行,但从更远的角度看它会使物体以椭圆形或螺旋形运动围绕中心飞行。粒子始终向中心加速,但是会飞过中心,直到重力迫使它一次又一次地返回。有些粒子飞得很远,以至于重力不再对它们产生太大影响,最终在改变方向之前被烧尽。

每个粒子具有X和Y速度,重力取决于该速度,并且相对于中心的角度和距离将重力添加到该速度。重力总是将速度增加到中心的方向(角度)。

所以对于粒子:位置,速度
对于重力井,您具有:位置,强度

从这些位置可以计算出粒子与重力井之间的角度。要计算角度,您需要两个坐标之间的增量。

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

该角度是需要相加的速度矢量的角度。

施加的力大小取决于距离。确切地说,它以距离的平方减小。因此,如果某物的距离是两倍远,则仅施加四分之一的力。对于距离,也需要增量。

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

您这样做是对的,但是我想答案是有用的,特别是对于那些在cos / sin方面不强的人,如果您在理论解释之后加上“优化的”伪代码。
GameAlchemist 2012年

我意识到这里的代码不是经过优化的,但是您似乎可以避免在远处调用sqrt(),因为稍后会通过平方来立即使用它。
凯尔·巴兰

2

在我看来,绘制的是段而不是点。因此,我猜想井以高速且与圆切线的速度矢量弹出圆点。紧接着又抛出另一点,该点与第一个点相连以绘制线段。然后,我认为物理定律(牛顿)被施加了很强的引力,这解释了速度下降。所以我想您必须按时集成才能做到这一点。

其中: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   

初始化:产生新点的最简单方法是选择角度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),因此将它们存储起来。

因此,如果您生成很多点,它们之间是两两相连的,并且同时更改了初始角度A以使线段源围绕井旋转,那么您猜中的解决方案就非常接近了。

编辑:我认为你应该先尝试一下,没有摩擦,这可能还可以。摩擦力是与速度成比例的力,但方向相反。所以等式变为:

    Acc = Gravity force + Friction Force.

摩擦力=-常数* Vel。这我不知道如何集成,所以我将逐步进行集成:

   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

该效果是带有扭曲的标准重力效果,当粒子进入一定范围内时,会在切线法线上施加力。这会导致粒子以相当不稳定的方式“绕动”。处理草图中的粒子不会燃烧掉,但是在它们的轨道顶点处,这是它们会燃烧掉并释放另一束的时间。谢谢大家的帮助,即使它并没有真正为我提供任何新信息,也非常感谢您将时间和精力投入到答案中。再次感谢!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.