二维碰撞n体模拟(大量球的快速碰撞检测)

时间:2010-03-20 01:11:24

标签: collision-detection modeling

我想编写一个程序来模拟2D平面上大数(N = 1000 - 10 ^ 5和更多)物体(圆圈)的运动。所有的身体都有相同的尺寸,它们之间唯一的相互作用就是弹性碰撞。

我希望得到像Crazy Balls这样的东西,但规模更大,有更多的球和更密集的飞机填充物(不像这里的气体模型,但像沸水模型一样)。

所以我想要一种快速的检测方法,球号i在2 *半径+ V * delta_t距离内的路径上有任何其他球。我不想为每个i球完全搜索与N球的碰撞。 (此搜索将是N ^ 2.)

PS对不起循环动画GIF。只需按Esc即可停止它。 (不适用于Chrome)。

3 个答案:

答案 0 :(得分:4)

物理模拟的第一步是广角碰撞检测。这里概述了几种方法http://http.developer.nvidia.com/GPUGems3/gpugems3_ch32.html,但两个基本方法是空间分区,将对象划分为网格,或排序和扫描,其中包括沿两个轴排序所有对象。

答案 1 :(得分:1)

显然,您希望避免(N1 - )* N检查每次迭代的冲突。一种简单的方法是将区域划分为2D网格单元格,然后进行单次传递以确定每个球在当前迭代中经过的单元格。然后每个球只检查穿过它通过的细胞的球的碰撞。

我确信有更复杂的方法,但这可能是一个好的开始。

答案 2 :(得分:1)

网格宽度/长度应大于或等于它们的半径,搜索应该在第一个邻居上(8 +中心= 9个网格)。 使用最小网格尺寸,它是粒子计算数量的十到十五倍。