碰撞检测 - 移动球体和圆柱体之间的响应

时间:2013-03-09 11:41:11

标签: 3d geometry collision-detection game-physics

我正在实施一个包含3d逻辑的简单游戏。为了检测移动的球体是否与圆柱体碰撞,程序或/和相对方程是什么?我的圆柱是静态的右圆形并与z轴对齐。在这种情况下,我读到圆柱体的方程为(x - a)²+(z - b)²=r²,其中

(a,b):圆柱体的中心 r:圆柱半径

如何使用它来查找两个物体是否相交,另外,我如何应用球的相应响应?

谢谢

1 个答案:

答案 0 :(得分:1)

通常可以将圆柱到球面测试简化为点到线段测试,其中:

  1. 线段表示穿过中心的线 圆柱体从端到端端点是已知的。
  2. 该点代表球体的中心点。
  3. 测试在线段上找到最接近centerPoint的点 并简单地测量点之间的距离,如果它更小 比球半径+圆柱半径,它是碰撞的。
  4. 与此相妥协的是,它使得它实际上是一个球体到胶囊测试而不是球体到圆柱体。如果你能忍受这种妥协,这里有一些伪代码。

    vector cylCenterVector = endPoint2 - endpoint1;
    float distanceFactorFromEP1 = Dot(sphereCenter - endPoint1) / Dot(cylCenterVector , cylCenterVector );
    if(distanceFactorFromEP1 < 0) distanceFactorFromEP1 = 0;// clamp to endpoints if neccesary
    if(distanceFactorFromEP1 > 1) distanceFactorFromEP1 = 1;
    vector closestPoint = endPoint1 + (cylCenterVector * distanceFactorFromEP1);
    
    vector collisionVector = sphereCenter - closestPoint;
    float distance = collisionVector.Length();
    vector collisionNormal = collisionVector / distance;
    
    if(distance < sphereRadius + cylRadius)
    {
      //collision occurred. use collisionNormal to reflect sphere off cyl
    
      float factor = Dot(velocity, collisionNormal);
    
      velocity = velocity - (2 * factor * collisionNormal);
    
    }