1

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

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

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

因此,我真的很想听听任何似乎非常适合这种碰撞问题的技术、算法或库,或者你可能需要做的任何想法。真的,任何形式的帮助都将不胜感激。

4

2 回答 2

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 个无效冲突的成本。这对于中等数量的粒子(最多数百个)是相当有效的。它的好处是您只需要在碰撞时处理事物,而不是等间隔的时间步长。这对于人口稀少的模拟来说特别有效。

于 2013-05-28T21:50:11.627 回答
0

我想八叉树方法最适合您的问题。八叉树将虚拟空间划分为树的几个递归叶子,并让您计算最可能的节点之间可能发生的冲突。

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

于 2013-05-27T18:22:22.963 回答