0

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

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

如何使用它来查找两个对象是否相交,此外,如何应用球的相应响应?

谢谢

4

1 回答 1

1

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

  1. 线段表示从一端到另一端穿过圆柱体中心的线,并且端点是已知的。
  2. 该点表示球体的中心点。
  3. 该测试在线段上找到一个最接近 centerPoint 的点,并简单地测量点之间的距离,如果它小于球体半径 + 圆柱体半径,则它正在碰撞。

与此的妥协是,它有效地使其成为一个球体到胶囊测试,而不是球体到圆柱体。如果你能接受这种妥协,这里有一些伪代码。

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);

}
于 2013-03-09T15:40:04.860 回答