我認爲你是在正確的軌道與你在想什麼的,在一個盒子一些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