C# 求3个相交球面的X,Y,Z笛卡尔位置

C# 求3个相交球面的X,Y,Z笛卡尔位置,c#,collision,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 = c1

我正试图计算出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个球体需要在同一平面上。实际上,我希望能够灵活地将它们放置在我希望的任何位置


有人能帮我修改一下代码,这样我就可以把高度也加入到方程中,或者给我指出我需要做的事情的正确方向吗?

你知道吗,随机放置的三个球体的“碰撞”(我假设你定义为“三个球体同时接触的点”)会产生
0,1,2
Inf
碰撞点的数量,严格取决于每个球体的位置和半径

这不仅仅是一点

您需要模拟空间并扫描它以寻找感兴趣的点(即通过建议的八叉树),或者您需要实际求解三个方程:

(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
三次,抱歉。我不会纠正这一点,因为这会降低所有内容的可读性。

为什么不使用八叉树来简化此过程?我以前从未使用过八叉树。