2009-02-01 73 views
3

我一直在玩this flash game,经过最初的('lol,fire')反应之后,我开始想知道如何在编程中复制这种接触 - 改变的行为。我猜这有点像honeypot xkcd如何创建随机模拟?

我正在考虑从颗粒相互偏转和包含墙壁的情景开始。序列将从一组“突变”粒子开始,当这些突变体与常规粒子碰撞时,它们本身就会变成突变体。以后我可以在一些更有趣的事情上工作。

我的问题是如何开始使用这个。我打算在C#中使用.NET的绘图元素(虽然我对C#相当陌生 - 如果有一个.NET的不同部分,我应该让我知道),但是如果有任何一般的论文,有兴趣阅读它们(如果它们当然可以在线获得)。

感谢, 罗斯

+0

我也发现了这个教程在CodeProject:http://www.codeproject.com/KB/game/particlessystems.aspx – Ross 2009-02-01 16:37:38

回答

4

我认为你是在正确的轨道与你在想什么的,在一个盒子一些particles会做在这里很好。我无法想象你会找到关于这样一个特定和简单情况的论文,但也许对于某些所需的技术而言,但与渲染器相比,后端的实现应该相对简单。

围绕一个简单的方法移动粒子是Euler iteration,您可以在其中存储位置和速度。位置=位置+速度* dt;其中dt是自上一帧以来的时间变化。最好保持dt不变,并在渲染器的点之间进行插值(如果可以的话)...这将减少稳定性问题并使碰撞检测更容易。

若要将某个粒子反射出墙壁,请检查其x分量或y分量的位置是否会超出边界,然后翻转速度其他分量的符号,例如,

if(Math.Abs(position.x_component + velocity.x_component * dt) > x_bound) 
    velocity.y_component = -velocity.y_component; 

if(Math.Abs(position.y_component + velocity.y_component * dt) > y_bound) 
    velocity.x_component = -velocity.x_component; 

如果你有恒定的dt,这个效果很好,但如果它变化,你需要做一些更复杂的事情。找到与框中的碰撞点和reflect与碰撞的脸部框外的矢量部分。

对于碰撞粒子彼此距离检查可能是最好的,一旦距离太小,触发反射。即如果他们太靠近,他们会碰撞。如同粒子是球体那样反映速度分量,所以反射的法线是它们位置的差异。

您可能会发现在gamedev this article有用的太...

希望这有助于。