【发布时间】:2017-10-26 17:00:11
【问题描述】:
我正在编写代码来模拟粒子运动。 (目前 2D 很快 3D 希望) 问题是,如果我使用相对较大的时间步长,粒子最终会相互穿过。
您有什么建议可以让我在不使用非常小的步骤的情况下纠正它吗? (如果有很大的不同,它是在 C++ 中)。
【问题讨论】:
-
请考虑添加您的代码以查看最佳方法。
标签: optimization simulation collision particles
我正在编写代码来模拟粒子运动。 (目前 2D 很快 3D 希望) 问题是,如果我使用相对较大的时间步长,粒子最终会相互穿过。
您有什么建议可以让我在不使用非常小的步骤的情况下纠正它吗? (如果有很大的不同,它是在 C++ 中)。
【问题讨论】:
标签: optimization simulation collision particles
use of timestep to advance the clock introduces model artifacts 会破坏模型的有效性,就像您的情况一样。请改用离散事件调度。这个paper from Winter Simulation Conference 2005 描述了如何在离散事件框架中实现移动。您的模型不仅会更准确,而且可能会运行得更快。
【讨论】:
所以你必须做某种collision detection 来查看两个对象是否会发生碰撞。
根据您的数据结构,检测可能采用多种形式。如果您只有一个点列表,则必须在 N^2 中为粒子的每一步检查所有点(添加运动矢量以创建更大的空间足迹)。这可以通过GJK 算法来完成。
使用一些空间数据结构可以通过仅在一组修剪过的粒子上运行 GJK 来降低复杂性,即无需检查它们是否不可能重叠。
【讨论】: