【问题标题】:How to get the time when two capsules will collide如何获得两个胶囊碰撞的时间
【发布时间】:2014-03-18 15:29:26
【问题描述】:

我正在开发一个简单的碰撞系统,专注于让胶囊发生碰撞。使用许多资源,但主要是this site 我已经能够让两个胶囊相互碰撞。这种方法给了我两条线段之间的最短距离。然后我检查两个胶囊的组合半径,看看是否发生碰撞。

这是可行的,但这个解决方案有两个问题:

  1. 如果对象移动得非常快,以至于它们将相互穿过,半径检查将失败,并且对象将相互穿过。
  2. 当确实发生碰撞时,我不知道如何使对象齐平以实际接触(例如,当角色落地时)。

我有另一个函数,我发现here 使用球体,它将返回两个球体碰撞的时间。使用此功能时,我检测到碰撞(时间

【问题讨论】:

    标签: line physics collision


    【解决方案1】:

    希望这有帮助...

    通常,问题 #1 没有直接的解决方案,并且会永远困扰您。时间积分步长必须足够小,以防止它与您使用的速度一起发生。 (如果您只能以某种方式计算正距离=|x2-x1|...,则尤其如此)

    我并没有真正理解胶囊和球体之间的区别,但是 你不是在计算距离,对于 dt 之前和之后的每个维度:

       dx = obj1.x - obj2.x;
       dy = obj1.y - obj2.y;
       dz = obj1.z - obj2.y;  
       dxlater = obj1.x + obj1.vx*dt - (obj2.x + obj2.vx*dt);
       dylater = obj1.x + obj1.vy*dt - (obj2.y + obj2.vy*dt);
       dzlater = obj1.x + obj1.vz*dt - (obj2.z + obj2.vz*dt);
    

    如果dx和dxlater的符号不同,则物体发生碰撞,即如果:

       if (dx*dxlater < 0) // collision occured
    

    如果您想知道碰撞发生的时间,请求解 distance=RAD_SUM for t:(对于所有维度)

       obj1.x + obj1.vx*tc - (obj2.x + obj2.vx*tc) = RAD_SUM
    

    应该是:

       tc = (RAD_SUM + obj2.x - obj1.x)/(obj1.vx - obj2.vx)
    

    像往常一样计算到该点的位置,然后计算新速度,然后应用新速度直到 dt 结束。

    【讨论】:

    • 这听起来会起作用,但我没有最近线的点(你的例子中的 obj1 和 obj2 )。我只有距离。第一个链接中提供的算法使用矢量数学来获取距离,而无法获取该线的两个端点。如果我能得到两条线之间距离的线的端点,我可以试试你的解决方案。
    • “两条线的距离”是obj2.x-obj1.x吧?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-22
    • 1970-01-01
    • 2015-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多