我认为你是在正确的轨道与你在想什么的,在一个盒子一些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有用的太...
希望这有助于。
我也发现了这个教程在CodeProject:http://www.codeproject.com/KB/game/particlessystems.aspx – Ross 2009-02-01 16:37:38