处理质量弹簧系统之间碰撞的好方法

时间:2013-05-27 18:14:26

标签: c++ algorithm collision-detection physics collision

我正在编写一个C ++仿真应用程序,其中几个质量弹簧结构将移动和碰撞,我正在努力解决碰撞检测和响应部分。这些结构可能关闭也可能不关闭(它可能是一个“球”或只是一团质量和弹簧链)所以我认为(我认为)不可能使用“经典”方法来测试2个重叠的形状。

此外,碰撞是该模拟的一个非常重要的部分,我需要它们在检测和响应方面尽可能准确(实时不是这里的约束)。我希望能够尽可能地知道应用于每个节点(质量)的力。

目前我正在检测每个时间步的节点和弹簧之间的碰撞,并且检测似乎有效。我可以计算一个节点和一个弹簧之间的碰撞时间,从而找到碰撞的确切位置。但是,我不确定这是否是解决这个问题的正确方法,经过大量的研究,我无法找到一种方法来使事情正常工作,主要是在碰撞的响应方面。

因此,我真的希望听到任何技术,算法或库看起来非常适合这种碰撞问题,或者您可能需要做出任何想法。真的,任何形式的帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

如果您符合以下条件:

 0) All collisions are locally binary - that is to say 
    collisions only occur for pairs of particles, not triples etc, 
 1) you can predict the future time for a collision between 
    objects i and j from knowledge of their dynamics (assuming that no other
    collision occurs first)
 2) you know how to process the physics/dynamicseac of the collision

然后你应该能够做到以下几点:

设Tpq是粒子p和q之间碰撞的预测时间,而Vp(Vq)是保持每个粒子p(q)的局部动力学的结构(即其速度,位置,弹簧常数,等等)

对于n粒子......

Initialise by calculating all Tpq (p,q in 1..n)
Store the n^2 values of Tpq in a Priority Queue (PQ)
repeat
  extract first Tpq from the PQ
  Advance the time to Tpq
  process the collision (i.e. update Vp and Vq according to your dynamics)
  remove all Tpi, and Tiq (i in 1..n) from the PQ
    // these will be invalid now as the changes in Vp, Vq means the
    // previously calculated collision of p and q with any other particle
    // i might occur sooner, later or not at all
  recalculate new Tpi and Tiq (i in 1..n) and insert in the PQ
until done

有一个o(n ^ 2)初始设置成本,但重复循环应为O(nlogn) - 删除和替换2n-1无效冲突的成本。对于中等数量的粒子(高达数百个),这是相当有效的。它的好处是您只需要在碰撞时处理事物,而不是等间隔时间步。这使得人口稀疏的模拟特别有效。

答案 1 :(得分:0)

我猜一个八叉树方法最适合你的问题。八叉树将虚拟空间划分为树的几个递归叶,并允许您计算最可能节点之间可能的冲突。

这里简短介绍:http://www.flipcode.com/archives/Introduction_To_Octrees.shtml:)