如何用粒子模拟压力?


11

我正在尝试在要构建的Unity游戏中使用一组球形粒子来模拟压力。关于此问题的几个注意事项:

  • 目标是用无摩擦的小球填充不断变化的2d空间/空隙。游戏正在尝试模拟将更多物体推入该空间的压力不断增加。
  • 关卡本身一直在从左向右滚动,这意味着如果用户未更改该空间的尺寸,它将自动变小(该空间的最左侧部分将不断在屏幕外滚动)。

我想知道我可以采取什么方法来解决这些问题...

  1. 知道何时检测何时有空间要填充,然后将球体添加到该空间。
  2. 缩小时,从空间中移除球体。
  3. 模拟球体上压力的策略,以便在创建更多空间时它们“向外爆炸”。

我正在考虑的当前方法是使用不断移动的墙,该墙不在屏幕上并随屏幕移动,如下图所示:

压力!

这个移动的壁会将球体推入并捕获到空间中。至于添加新球体,我将要么(1)在检测到自由空间时复制球体,要么(2)在空间的左侧(壁所在的位置)生成它们-将其余球体推向填补空间。我预见了想法1的问题,因为这可能不会真正产生/模拟压力。想法2似乎更有希望,但是提出了一个问题,即如何为这些新的球形粒子提供生成位置(以及在没有空间的情况下生成它们的后果)。

非常感谢您的智慧!

Answers:


6

我不确定您要实现的目标是什么,当空间从屏幕上滑落时,墙壁是否在推动粒子运动,这是游戏机制吗?

至于您的三点,我认为,如果您这样对待粒子,这些行为都会出现:让每个粒子与距离成反比地排斥其他粒子,并使它们与您的空间壁碰撞以阻止它们。

紧密靠近的粒子会互相排斥,从而散布开来填充空白空间,直到被障碍物阻止为止。如果/当壁移动以缩小空间并推动粒子时,它们将被推到更靠近其他粒子的位置,将它们排斥得更强,进而推压其他粒子,从而增加了总体压力。

这将非常类似于具有负吸引力的n体模拟,因此根据粒子的数量,计算每个粒子与其他粒子的排斥力可能会变得非常昂贵。您可以尝试通过使每个粒子仅被您的粒子质量的平均重心排斥来简化此操作,这可能会在带有弯曲的长而薄的区域中产生奇怪的行为(尽管您的气体不会膨胀到远离该区域弯曲的区域)例如重心)。

至于创建和删除粒子(以确保有足够的数量在视觉上填充我假定的空间?),您可能要确保在密度不足时不要简单地添加或删除粒子,因为这会引入更多的粒子排斥其他粒子,从而增加或降低压力。

因此,您可能想在推斥力计算中引入一个因子,例如从1.0开始,然后添加x个粒子,使新的因子为n /(n + x),其中n是添加新粒子之前的总粒子数。


2

压力(如气体中的压力)仅仅是颗粒之间以及颗粒与壁之间发生普通弹性碰撞的结果。您只需测量每次与墙壁的碰撞量即可获得压力值。

您给出的2个想法与压力没有直接关系,因为压力是在封闭的volumina中以恒定数量的粒子和给定的温度给出的(这导致粒子运动得更快或更慢)。

如果将粒子添加到此封闭系统中,则压力会上升,因为整个系统中的能量更多(您只是以给定的温度-速度添加了一个新粒子)。


粒子应具有弹性碰撞的质量,因为假定壁的质量接近+无穷大
Aron_dc 2012年

我说过“压力是每次与墙壁碰撞的数量”,这是100%精确的。在弹性碰撞中,您将获得该粒子的脉冲,并测量施加给墙壁的脉冲数。因此,如果一个粒子在垂直于壁的方向上碰撞,则壁将获得2mv的脉冲(m =粒子质量; v =粒子速度)。因此,您实际上可以测量传入的脉冲到墙壁上。粒子只是被反射(碰撞前的v =碰撞后的-v)。这甚至有助于测量不同气体(颗粒的m值不同)的混合物的压力。
Aron_dc

0

每个循环都应遍历所有粒子,然后计算对该粒子的最终作用力。基本上,如果壁碰撞,则壁总是在x轴上给它们一个正向力矢量(粒子.x-粒子.r <= 0)。

然后,根据它们之间的夹角,它们碰撞的每个粒子也会赋予它们一个力矢量。您收集所有粒子的这些角度,计算平均值,然后就可以了!

您也可以在这里使用许多优化技术,只需查阅一些球物理教程即可。基本上,您只希望对每粒子进行一次迭代,并为它们计算力矢量并将其存储在其中。

基本上,这将模拟气体,如果您给它们提供恒定的力,那么液体也可以模拟。

至于创建和删除粒子,我实现了ParticleEmitter类,该类具有位置,方向和其他有用的东西。您的示例最好使用可以在一定范围内甚至是矩形范围内创建粒子的发射器。

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.