找到2个球体的碰撞点

时间:2017-03-18 21:24:13

标签: math vector lua

我知道这不是找到碰撞点的“正确”方法,因为可能有1个OR 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个球体的碰撞点?
  3. 我在StackOverflow上阅读了一些问题,但大多数问题要么无关紧要,要么似乎没有意义。

1 个答案:

答案 0 :(得分:0)

p0,p1成为中心,然后r0,r1成为半径

if (|p1-p0|<=r0+r1)  // collision if centers closer then sum of radiuses
 {
 p = p0 + ((p1-p0) * r0 / (r0+r1)); // weighted linear interpolation
 }

碰撞点不是中心之间的中点,而是更接近较小的球体。该方程仅精确if (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) is your collision point
 }

您还可以获得重叠体积的重叠圆圈。它是上面计算的中心(x,y,z)和垂直于矢量(p1-p0)的圆的圆,它也定义了两个球的切割平面。因此,如果您需要此圆圈内的点,请使用基础向量和圆/圆盘的简单参数或隐式函数。有关详细信息,请参阅: