gpt4 book ai didi

algorithm - 模拟许多粒子碰撞的有效方法?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:23:27 24 4
gpt4 key购买 nike

我想编写一个模拟许多粒子碰撞的小程序,首先从 2D 开始(稍后我会将其扩展到 3D),以(在 3D 中)模拟朝向玻尔兹曼分布的收敛,并查看分布如何在 2D 中演化。

我还没有开始编程,所以请不要索要代码示例,这是一个相当笼统的问题,应该可以帮助我入门。这个问题背后的物理学对我来说没有问题,而是我必须模拟至少 200-500 个粒子才能实现相当好的速度分布。我想实时进行。

现在,对于每个时间步长,我会首先更新所有粒子的位置,然后检查碰撞,以更新新的速度矢量。然而,这包括大量检查,因为我必须查看是否每个粒子都与其他粒子发生碰撞。我找到了 this发布到或多或少相同的问题,那里使用的方法也是我唯一能想到的方法。然而,恐怕这在实时情况下效果不佳,因为它会涉及太多的碰撞检查。

那么现在:即使这种方法在性能方面可行(比如说 40fps),有人能想出一种方法来避免不必要的碰撞检查吗?

我自己的想法是将棋盘(或在 3D:空间中)拆分为正方形(立方体),这些正方形(立方体)的尺寸至少为粒子的直径,并实现一种仅在两个粒子的中心为在网格的相邻方 block 内...

我很乐意听到更多想法,因为我想尽可能多地增加粒子的数量,同时仍然进行实时计算/模拟。

编辑:所有碰撞都是纯弹性碰撞,没有任何其他力对粒子做功。我将实现的初始情况由用户选择的一些变量决定,以选择随机起始位置和速度。

Edit2: 我找到了一篇关于粒子碰撞模拟的好论文,非常有用 here .希望它可以帮助一些对更深入感兴趣的人。

最佳答案

如果你想一想,在平面上移动的粒子实际上是一个 3D 系统,其中三个维度是 xy 和时间 (t).

假设“时间步长”从 t0t1。对于每个粒子,您根据当前粒子位置、速度创建从 P0(x0, y0, t0)P1(x1, y1, t1) 的 3D 线段和方向。

在 3D 网格中划分 3D 空间,并将每个 3D 线段链接到它穿过的单元格。

现在,应该检查每个网格单元格。如果它链接到 0 或 1 个段,则不需要进一步检查(将其标记为已检查)。如果它包含 2 个或更多段,则需要检查它们之间的碰撞:计算 3D 碰撞点 Pt,缩短两个段以在该点结束(并删除指向它们不存在的单元格的链接cross anymore),根据粒子的新方向/速度,创建从 Pt 到新计算的 P1 点的两个新段。将这些新线段添加到网格并将单元格标记为已选中。向网格添加线段将所有交叉的单元格变为未选中状态。

当您的网格中不再有未选中的单元格时,您就解决了时间步长问题。

编辑

  • 对于 3D 粒子,将上述解决方案调整为 4D。
  • 在这种情况下,八叉树是 3D 空间分区网格的一种很好的形式,因为您可以“冒泡”检查/未检查状态以快速找到需要注意的单元格。

关于algorithm - 模拟许多粒子碰撞的有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13046033/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com