找到3个相交球体的X,Y,Z载体位置

时间:2013-11-13 10:13:42

标签: c# collision

我正在尝试计算3个球体将碰撞的3D点。目前,从上到下的角度来看,我有这些球体相遇的X,Z位置。当他们这样做时,我放置一个游戏对象来显示他们遇到的地方。

这是代码:

public void calculatePoints_H(Vector3 c1p, Vector3 c2p, float c1r, float c2r, out Vector3 startLine, out Vector3 endLine)
{

    //get the positions
    Vector3 P0 = c1p;
    Vector3 P1 = c2p;

    float d,a,h;

    //d is the distance between centres
    d = Vector3.Distance(P0,P1);
    //a is checking if the spheres are inside, outside or colliding
    a = (c1r*c1r - c2r*c2r + d*d)/(2*d);
    //
    h = Mathf.Sqrt(c1r*c1r - a*a);

    //Debug.Log(d + " " + a + " " + h);

    Vector3 P2 = (P1 - P0);
            P2 = (P2 * (a/d));
            P2 = (P2 + P0);

    //Debug.Log(P2);

    float x3,y3,x4,y4 = 0;

    x3 = P2.x + h*(P1.y - P0.y)/d;
    y3 = P2.y - h*(P1.x - P0.x)/d;

    x4 = P2.x - h*(P1.y - P0.y)/d;
    y4 = P2.y + h*(P1.x - P0.x)/d;;

    //Debug.Log(x3 + " " + y3 + " " + x4 + " " + y4);

    Debug.DrawLine(new Vector3(x3,0,y3), new Vector3(x4,0,y4),Color.green);

    startLine = new Vector3(x3,0,y3);

    endLine = new Vector3(x4,0,y4);


}

现在我要做的就是找到这三个相遇的高度。原因是因为目前我的3个球体都需要在同一个平面上。真的,我希望能够灵活地将它们放在我想要的任何地方。

有人可以帮我修改我的代码,以便我可以将高度纳入等式中,或者指出我需要做的正确方向吗?

1 个答案:

答案 0 :(得分:0)

您是否意识到这样一个事实:“碰撞”(我假设您将其定义为“一次触及所有3个球体的点”)随机放置的三个球体产生0, 1, 2Inf个数字碰撞点,严格依赖于每个球体的位置和半径?

这不仅仅是一点。

您需要模拟空间并扫描它以寻找有趣的点(即通过建议的OctTree),或者您需要实际解决这三个方程:

(x-x0)^2+(y-y0)^2=r0^2
(x-x1)^2+(y-y1)^2=r1^2
(x-x2)^2+(y-y2)^2=r2^2

其中xNyNrN是球体的参数,而xy是“碰撞点”坐标。

你可以代数地做(如果你不喜欢数学,请参阅wolfram aplha),或者你可以尝试任何零点查找器:

(x-x0)^2+(y-y0)^2 + (x-x1)^2+(y-y1)^2 + (x-x2)^2+(y-y2)^2 - r0^2 - r1^2 - r2^2

我没有尝试也没有对它进行分析,但是球体是完全光滑的并且是完全凸起的,所以不应该有任何恶意的局部最小值,甚至简单的二分或梯度滑动都可能就足够了。

然而,请注意,虽然“以代数方式解决”可以很容易地向您显示有2个或INF点的碰撞,但“扫描空间”或零搜索器可能只返回一个点,第一个/最好它有命中(或没有)。在这种情况下,要获得其他最小值,您可能必须使用稍微不同的“起始位置”启动它...但这取决于您选择的精确扫描算法。

编辑:当然上面的公式应该是3D,所以加上(z-z0)^2三次,抱歉。我没有纠正这一点,因为它会使一切都变得不那么可读。