物体碰撞编程(多碰撞情况)

时间:2012-04-28 12:51:10

标签: collision-detection physics

我一直在学习关于phisics编程中的碰撞,我有一个很大的疑问。

在球体中思考,当一个球体同时与2个球体碰撞时,我认为使两个球体移动的力量大小必须除以2。但是当我编程它的时候,我总是看到一个球体的速度比第二个球体的速度快,导致我编程它的方式首先与另一个球体碰撞。让我们展示一幅图像来清楚地画出问题:

enter image description here

首先它检测到红色球体。 然后检测到碰撞,力的大小就像只有一个球体。 然后它检测到橙色球体,力量值小于第一个。

知道我必须使用什么来编程,或者我是否有任何误解?

MOD

此外,如果你帮助我寻找能够很好地实现这一目标的机制,我会给你50多个。

4 个答案:

答案 0 :(得分:1)

在计算任何力,速度,能量等变化之前,要小心测试所有可能的成对相互作用。听起来像物理模拟会在它检测到的第一次碰撞后立即计算动力学时感到高兴。

答案 1 :(得分:1)

DarenW的意思(作为一个n00b我不能直接评论他的回答)是序列应该是这样的:

//test for collisions
blueHitRed = didCollide(blue, red)
blueHitOrange = didCollide(blue, orange)
...
//calculate resultant velocities
red.velocity = ...
orange.velocity = ...
blue.velocity

然而,从您的描述看来,这样的事情实际上正在发生

//red
blueHitRed = ...
red.velocity = ...
blue.velocity = ...
//orange
blueHitOrange = ...
orange.velocity = ...
blue.velocity = ...

答案 2 :(得分:1)

问题在于,对于双体碰撞,能量和动量的守恒基本上足以确定结果,但对于三体问题,情况已不再如此。即使你确实做了马克和达伦所建议的事情,并确定了时间步中的所有碰撞体,它并没有真正让你到任何地方,因为1)你仍然不知道如何在碰撞后移动物体; 2)每次碰撞时要考虑多少个物体的主要问题不是时间步长而是物体的变形,如果你正确对待这个时间步骤内的更新顺序就不重要了。例如,如果你有非常柔软的物体,它们可能会在很多时间内接触,而非常硬的物体只能接触几个步骤。

这个问题的一个很好的答案有点棘手,其原因包含在你的奖金问题中,即机制是什么。这个机制基本上只是你在简化问题中没有考虑的事情:物体的变形,滑动,旋转等,但这些通常是三体碰撞中的主要问题。

您的工作完全取决于您需要多少精确度。您可以假装所有碰撞都在两个对象之间,或者第三个碰撞两个总是完全对称(这是一个非常罕见的事件)。作为一个更准确的开始,您可以只考虑它们是可变形的物体,假设每个碰撞都有一个时刻,当一切都发生最大变形,这些变形产生的力是什么,并根据这些力量发送出去( F = DP / DT)。可以做出其他的近似,比如只是将动量转移基于首先被击中的动量转移,然后给它一个量比例do(变形量)/(到下一个物体的距离),或者一些这样的事情。

答案 3 :(得分:-2)

这是N-body problem的一个案例。一般来说,没有分析解决方案,所以你得到的是近似值。将它作为两个单独的碰撞处理是一个足够好的近似。

[编辑]澄清:当三个身体都在相互作用时,在很短的时间内,它就是n体问题。不是Newtoninan n-body问题,而是一个更普遍的案例。