我想编写一个模拟许多粒子碰撞的小程序,首先从2D开始(稍后将其扩展到3D),(在3D中)模拟向玻尔兹曼分布的收敛,并查看该分布如何在2D中演化。 。
我尚未开始编程,所以请不要索要代码示例,这是一个相当普遍的问题,应该可以帮助我入门。这个问题背后的物理问题对我来说没有问题,这是事实,我将必须模拟至少200-500个粒子,以实现相当不错的速度分布。我想实时进行。
现在,对于每个时间步长,我将首先更新所有粒子的位置,然后检查碰撞,以更新新的速度矢量。但是,这需要进行大量检查,因为我必须查看每个粒子是否都与其他粒子发生碰撞。我发现这篇文章或多或少都存在相同的问题,而且我所能想到的也是唯一的方法。但是,我担心这不能实时地很好地工作,因为它将涉及太多的冲突检查。
所以现在:即使这种方法在性能上可行(假设为40fps),任何人都可以想到避免不必要的冲突检查的方法吗?
我自己的想法是将板(或以3D:空间)分成正方形(立方体),这些正方形的尺寸至少为粒子的直径,并采用一种仅在两个粒子的中心在相邻正方形内的情况下检查碰撞的方法在网格中…
我很高兴听到更多的想法,因为我想尽可能地增加粒子的数量,并且仍在进行实时计算/模拟。
编辑: 所有碰撞都是纯弹性碰撞,没有任何其他力对粒子起作用。我将实现的初始情况将由用户选择的一些变量确定,以选择随机的起始位置和速度。
EDIT2: 我发现了粒子碰撞的模拟一个很好的和非常有益的纸在这里。希望它可以对一些更深入的人有所帮助。
如果你想起来了,移动的计划颗粒是一个真正的3D系统,其中三个维度x,y时间(t)。
x
y
t
假设“时间步长”从t0变为t1。对于每个粒子,您将基于当前粒子的位置,速度和方向创建从P0(x0, y0, t0)到的3D线段P1(x1, y1, t1)。
t0
t1
P0(x0, y0, t0)
P1(x1, y1, t1)
将3D空间划分为3D网格,然后将每个3D线段链接到其交叉的像元。
现在,应该检查每个网格单元。如果链接到0或1段,则无需进一步检查(将其标记为已选中)。如果它包含2个或更多的线段,则需要检查它们之间是否存在碰撞:计算3D碰撞点Pt,将两个线段缩短到此点为止(并删除到它们不再交叉的像元的链接),创建两个新的线段根据粒子的新方向/速度从Pt到新计算的P1点。将这些新的线段添加到网格并将单元格标记为已选中。在网格中添加线段会将所有交叉的单元格变为未选中状态。
Pt
P1
当网格中不再有未选中的单元格时,您已经解决了时间步长问题。
编辑