寻找2个球体的碰撞点

我知道这不是找到碰撞点的“正确”方法,因为可能存在1个或2个碰撞点(不会是0个,因为碰撞是保证的),但我想试一试看结果如何,所以我创建了3个球体,并且其中2个点(每个点都代表2个球体之间的碰撞点)远离它们应该存在的位置,好像我得到的方向向量相反了…这是我的Lua代码:

    local function getDist(s1, s2)
        local s1_Pos = (s2.Position - s1.Position).unit * s1.Size.X * .5
        local s2_Pos = (s1.Position - s2.Position).unit * s2.Size.X * .5
        return s1_Pos:Lerp(s2_Pos, .5)
    end
  1. 这段代码有什么问题?
  2. 如何找到2个球体的碰撞点?

我在StackOverflow上看了几个问题,但大多数都不相关或者看起来不太有意义。

点赞
用户2521214
用户2521214

如果 p0,p1 是两个圆心,r0,r1 是半径,则

if (|p1-p0|<=r0+r1)  // 如果两个圆心比两个半径的和更接近,则说明发生碰撞
 {
 p = p0 + ((p1-p0) * r0 / (r0+r1)); // 加权线性插值
 }

碰撞点不是中心点,而是向较小的球靠近。这个公式只有在 r0+r1 == |p1-p0| 的情况下才精确,否则两个球会重叠并返回重叠区域的中点。

所以如果 p0=(x0,y0,z0), p1=(x1,y1,z1),可以重写如下:

if ((x1-x0)*(x1-x0)+(y1-y0)*(y1-y0)+(z1-z0)*(z1-z0)<=(r0+r1)*(r0+r1))
 {
 x = x0 + (((x1-x0)*r0)/(r0+r1));
 y = y0 + (((y1-y0)*r0)/(r0+r1));
 z = z0 + (((z1-z0)*r0)/(r0+r1));
 // (x,y,z) 为碰撞点
 }

您也可以获取边界重叠的圆。它的中心是上面计算出来的 (x,y,z),垂直于向量 (p1-p0),这也定义了两个球的截面。因此,如果需要在此圆内获取点,则可以使用基向量和简单的圆/圆盘参数方程或隐式函数。了解更多信息,请参见:

2017-03-19 08:24:19