我正在实施一个包含3d逻辑的简单游戏。为了检测移动的球体是否与圆柱体碰撞,程序或/和相对方程是什么?我的圆柱是静态的右圆形并与z轴对齐。在这种情况下,我读到圆柱体的方程为(x - a)²+(z - b)²=r²,其中
(a,b):圆柱体的中心 r:圆柱半径
如何使用它来查找两个物体是否相交,另外,我如何应用球的相应响应?
谢谢
答案 0 :(得分:1)
通常可以将圆柱到球面测试简化为点到线段测试,其中:
与此相妥协的是,它使得它实际上是一个球体到胶囊测试而不是球体到圆柱体。如果你能忍受这种妥协,这里有一些伪代码。
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);
}