0

私は多数の 3D 球と球の交差に関する質問に目を通しましたが、残念ながら、それらは私の理解能力をはるかに超えているか、探しているものに合わせられていません。

これは Unity ゲーム エンジン内であり、c# を使用しています

このコードを機能させることができました:

public void calculatePoints_H(Vector3 c1p, Vector3 c2p, float c1r, float c2r, out Vector3 startLine, out Vector3 endLine)
{
    //c1p = circle one position
    //c1r = circle one radius

    Vector3 P0 = c1p;
    Vector3 P1 = c2p;

    float d,a,h;


    d = Vector3.Distance(P0,P1);

    a = (c1r*c1r - c2r*c2r + d*d)/(2*d);

    h = Mathf.Sqrt(c1r*c1r - a*a);


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

    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;;

    //draw visual to screen (unity 3D engine)
    Debug.DrawLine(new Vector3(x3,0,y3), new Vector3(x4,0,y4),Color.green);

    //out parameters for a line renderer
    startLine = new Vector3(x3,0,y3);
    endLine = new Vector3(x4,0,y4);


}

現在、このコードにより、交差する 2 つの球の x 軸と z 軸上の 2 つの点を計算し、線を引くことができます。

私が達成したいのはxyz交点であるため、メソッドに高さ(yベクトル3値)を追加して、球を任意の方向/高さから別の球と交差させることができます

誰かがこれを行う方法を理解するのを手伝ってくれませんか?

4

1 に答える 1

1

球が接している場合、交点が SphereA の中心から SphereB の中心までのベクトル AB に沿った距離であることがわかっているため球は便利です。その距離は、球の半径の関数です。

float dA = SphereA.radius / AB.magnitude // % distance along AB starting from SphereA

そこから、交点がABに沿ってどれくらい離れているかを計算します。

Vector3 p = SphereA.position + AB * dA; // eq: p`= p + direction * time

例 (Unity のビルトイン球プレハブを使用):

bool Intersect(out Vector3 ip, float threshold=0.1f){
    // vector from sphere 1 -> sphere 2
    Vector3 ab = Sphere2.transform.position - Sphere1.transform.position;

    // Calculate radius from Unity built-in sphere.
    // Unity spheres are unit spheres (diameter = 1)
    // So diameter = scale, thus radius = scale / 2.0f.
    // **Presumes uniform scaling.
    float r1 = Sphere1.transform.localScale.x / 2.0f;
    float r2 = Sphere2.transform.localScale.x / 2.0f;

    // When spheres are too close or too far apart, ignore intersection.
    float diff = Mathf.Abs(r2 + r1 - ab.magnitude);
    if( diff >= threshold) {
        ip = Vector3.zero;
        return false;
    }
    // Intersection is the distance along the vector between
    // the 2 spheres as a function of the sphere's radius.
    ip = Sphere1.transform.position + ab * r1/ab.magnitude;
    return true;
}

使用例:

void FixedUpdate(){
    Vector3 p; //will hold intersection point if one is found
    if(Intersect(out p,0.1f)){
        IntersectionPoint.transform.position = p;
        IntersectionPoint.renderer.enabled = true;
    } else {
        IntersectionPoint.renderer.enabled = false;
    }
}

これは単一の交点のみを返します。球体が重なっている場合のように、複数の交点がある場合は、別の問題に取り組む必要があります。

于 2013-11-12T15:13:30.483 に答える