我认为你的想法是正确的,一个盒子里的一些粒子在这里会很好。我无法想象你会找到关于这样一个具体而简单的案例的论文,但也许是一些所需的技术,但与渲染器相比,后端的实现应该相对简单。
移动粒子的一个简单方法是欧拉迭代,您可以在其中存储位置和速度。位置=位置+速度*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,这很有效,但如果它变化,你将需要做一些更复杂的事情。找到与盒子的碰撞点,并将向量在盒子外面的部分反射到被碰撞的面上。
为了使粒子相互碰撞,最好进行距离检查,一旦距离太小就会触发反射。即,如果它们靠得太近,它们就会发生碰撞。像粒子是球体一样反射速度分量,因此反射的法线是它们的位置差。
您可能会发现这篇关于 gamedev 的文章也很有用...
希望这可以帮助。