【问题标题】:Object Collision Programming (Multiple collision case)对象碰撞编程(多重碰撞案例)
【发布时间】:2012-04-28 12:51:10
【问题描述】:

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

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

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

知道我必须用什么来编程这个,或者我有什么误解吗?

模组

此外,如果你帮我寻找一种可以很好地实现这一点的机制,我会给你 50 多个。

【问题讨论】:

  • 这是现实的。你确定要让它更“完美”吗?
  • 我喜欢让它最接近真实碰撞的可能性,以便以后在计算成本不值得时进行近似。

标签: collision-detection physics


【解决方案1】:

问题在于,对于两体碰撞,能量和动量守恒基本上足以确定结果,但对于三体问题,情况不再如此。即使你按照 Mark 和 Daren 的建议去做,并在一个时间步内确定所有碰撞的物体,它也不会真正让你到达任何地方,因为 1)你仍然不知道如何在碰撞后移动物体; 2)在每次碰撞期间要考虑多少个对象的主要问题不是时间步长,而是对象的变形,如果你正确对待这一点,一个时间步长内的更新顺序将无关紧要。例如,如果您有非常柔软的物体,它们可能会接触很多时间步长,而非常硬的物体只会接触几个时间步长。

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

您所做的完全取决于您需要多少准确度。您可以假设所有碰撞都发生在两个对象之间,或者第三个碰撞两个对象总是完全对称的(这是一个非常罕见的事件)。作为一个更准确的开始,您可以只考虑它们是可变形的物体,假设每次碰撞都有一个时刻,当一切都发生最大变形时,这些变形产生的力是什么,并根据这些力发送东西( F=dp/dt)。不过,可以进行其他近似,比如根据首先被击中的一个来划分动量传递,并给它一个与 do(变形量)/(到下一个物体的距离)成比例的量,或类似的东西。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 那么你将如何计算动态?
    【解决方案3】:

    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 = ...
    

    【讨论】:

    • 嗯嗯,这个方法很好。计算什么与什么碰撞,然后按顺序计算速度。给你一分:)。
    【解决方案4】:

    这是N-body problem 的情况。一般来说,没有解析解,所以你只能得到一个近似值。将其视为两个单独的碰撞是一个足够好的近似值。

    [编辑]澄清:当三个物体都相互作用时,在很短的时间跨度内,这是n体问题。不是牛顿 n 体问题,而是更一般的情况。

    【讨论】:

    • 不,它不是 N体问题。
    • 是的。与牛顿 n 体问题的唯一区别在于,这不是万有引力,因此常数不同。交互仍然遵循反距离平方定律。即使您将其简化为即时交互。
    • 我不小心投了反对票。对不起,我觉得你说得对,一切都是由碰撞的时刻决定的,当它们都变形并接触时,那就是三体问题。 (我要更改为时已晚,但如果您编辑答案,我会投赞成票。)
    猜你喜欢
    • 2013-10-28
    • 2013-08-21
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-18
    • 1970-01-01
    相关资源
    最近更新 更多