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

Posted

技术标签:

【中文标题】处理质量-弹簧系统之间碰撞的好方法【英文标题】:Good way to handle collisions between mass-spring systems 【发布时间】:2013-05-22 15:00:29 【问题描述】:

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

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

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

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

【问题讨论】:

这似乎是一个很好的华夫饼,但你对编程语言的具体问题是什么? 问题不是关于特定的编程语言,而是询问是否有人知道可以帮助我(和其他面临此类问题的人)处理冲突的算法或(c++)库质量弹簧结构。很抱歉,如果此类问题不在这里回答,我将不胜感激任何关于在哪里提问的提示。 这就是为什么这里不合适。我认为您应该找到一些描述的留言板或聊天室。那么在网上搜索呢?这是查找库的好方法。 这是一个难题,正如@Lightness 所说,对于*** 来说不是一个好问题。不过有一些值得一看的东西是SIGGRAPH course notes,特别是关于约束和碰撞的部分。 Kenny Erleben 的thesis 也有一节 (4.4) 关于碰撞响应。 非常感谢大卫·布朗,我很乐意对此进行调查。同样,如果在 ***.com 上只接受有关编程语言的具体问题,我感到非常抱歉。我以为也可以问算法设计相关的问题... 【参考方案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 个无效冲突的成本。这对于中等数量的粒子(最多数百个)是相当有效的。它的好处是您只需要在碰撞时处理事物,而不是等间隔的时间步长。这对于人口稀少的模拟来说特别有效。

【讨论】:

【参考方案2】:

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

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

【讨论】:

谢谢。八叉树可能有助于“广泛”阶段,但我已经可以计算节点和弹簧(或另一个节点)之间的碰撞时间。碰撞响应是这里的棘手部分。

以上是关于处理质量-弹簧系统之间碰撞的好方法的主要内容,如果未能解决你的问题,请参考以下文章

作业五之系统设计时所实现的质量属性战术

OpenGL +围绕点旋转弹簧和质量

非线性单自由度系统的 Newmark-beta 方法含Matlab源码

小谈音视频质量检测

——软件质量基础 重点部分总结

——软件质量基础 重点部分总结