2013-03-09 36 views
0

我正在实施一个简单的游戏,它包含了三维逻辑。为了检测移动的球体是否与圆柱碰撞,程序或/和相关方程是什么?我的圆柱体是静态的正圆形,并与z轴对齐。我读气缸的在这种情况下方程为(x - 一)2 +(Z - B)2 = R 2,其中碰撞检测 - 移动球体和圆柱体之间的响应

(A,B):气缸 为r的中心:圆柱体的半径

如何我可以用它来找出这两个物体是否相交,另外,我怎样才能应用相应的球反应?

谢谢

回答

1

通常,一个气缸到球体的测试可以被简化为一个点到线段测试,其中:

  1. 线段表示线通过的 从端气缸中心延伸结束终点是已知的。
  2. 该点代表球体的中心点。
  3. 该测试发现线段上最接近centerPoint 的一点,只是测量点之间的距离,如果它小于球体半径+ cyl半径,则它正在碰撞。

妥协与这是它使它有效地球囊测试而不是球体圆柱体。如果你能忍受这种妥协,这里有一些伪代码。

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

} 
+0

你是什么意思的胶囊?你的意思是圆柱体的顶部和底部会有半个球体吗? – CoachNono 2013-09-18 18:53:54

+0

@ CoachNono是的,这是正确的。 – 2013-09-18 20:29:44

+0

只是指出了一个错误,我相信在第一个dot产品中应该有一个cylCenterVector:点(sphereCenter - endPoint1,cylCenterVector)/点(cylCenterVector,cylCenterVector) – 2015-12-19 14:37:56