我知道这不是找到碰撞点的“正确”方法,因为可能有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
我在StackOverflow上阅读了一些问题,但大多数问题要么无关紧要,要么似乎没有意义。
答案 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)
的圆的圆,它也定义了两个球的切割平面。因此,如果您需要此圆圈内的点,请使用基础向量和圆/圆盘的简单参数或隐式函数。有关详细信息,请参阅: