我正在实现一个包含 3d 逻辑的简单游戏。为了检测运动的球体是否与圆柱体碰撞,程序或/和相关方程是什么?我的圆柱体是静态的正圆形并与 z 轴对齐。在这种情况下,我读到圆柱体的方程是 (x - a)² + (z - b)² = r²,其中
(a, b): 圆柱中心 r: 圆柱半径
如何使用它来查找两个对象是否相交,此外,如何应用球的相应响应?
谢谢
我正在实现一个包含 3d 逻辑的简单游戏。为了检测运动的球体是否与圆柱体碰撞,程序或/和相关方程是什么?我的圆柱体是静态的正圆形并与 z 轴对齐。在这种情况下,我读到圆柱体的方程是 (x - a)² + (z - b)² = r²,其中
(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);
}