如何获得两粒胶囊碰撞的时间

时间:2014-03-14 07:31:47

标签: line physics collision

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

这是有效的,但此解决方案存在两个问题:

  1. 如果物体移动得非常快,它们会相互移动,则半径检查将失败,物体将相互穿过。
  2. 当发生碰撞时,我无法知道如何使物体冲洗到实际接触(例如,当角色落在地面上时)。
  3. 我有另一个功能,我发现here使用球体,这将返回两个球体碰撞的时间。当使用此功能时,我检测到碰撞(时间< 1)我可以将该帧的物体速度乘以时间并使物体冲洗。我真的在寻找一种方法来修改该网站的网段冲突功能,以便为我提供与网段冲突相同的信息。

1 个答案:

答案 0 :(得分:0)

希望这有用......

通常,问题#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

如果你想知道发生碰撞的时间,解决距离= RAD_SUM为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

结束