0
我正在实施一个简单的游戏,它包含了三维逻辑。为了检测移动的球体是否与圆柱碰撞,程序或/和相关方程是什么?我的圆柱体是静态的正圆形,并与z轴对齐。我读气缸的在这种情况下方程为(x - 一)2 +(Z - B)2 = R 2,其中碰撞检测 - 移动球体和圆柱体之间的响应
(A,B):气缸 为r的中心:圆柱体的半径
如何我可以用它来找出这两个物体是否相交,另外,我怎样才能应用相应的球反应?
谢谢
我正在实施一个简单的游戏,它包含了三维逻辑。为了检测移动的球体是否与圆柱碰撞,程序或/和相关方程是什么?我的圆柱体是静态的正圆形,并与z轴对齐。我读气缸的在这种情况下方程为(x - 一)2 +(Z - B)2 = R 2,其中碰撞检测 - 移动球体和圆柱体之间的响应
(A,B):气缸 为r的中心:圆柱体的半径
如何我可以用它来找出这两个物体是否相交,另外,我怎样才能应用相应的球反应?
谢谢
通常,一个气缸到球体的测试可以被简化为一个点到线段测试,其中:
妥协与这是它使它有效地球囊测试而不是球体圆柱体。如果你能忍受这种妥协,这里有一些伪代码。
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);
}
你是什么意思的胶囊?你的意思是圆柱体的顶部和底部会有半个球体吗? – CoachNono 2013-09-18 18:53:54
@ CoachNono是的,这是正确的。 – 2013-09-18 20:29:44
只是指出了一个错误,我相信在第一个dot产品中应该有一个cylCenterVector:点(sphereCenter - endPoint1,cylCenterVector)/点(cylCenterVector,cylCenterVector) – 2015-12-19 14:37:56