Przecięcie promieni z czworokątami 3D w XNA?

Udało mi się więc wykonać promień reprezentujący mysz nieprojektowaną w świat, a teraz muszę sprawdzić, czy ten promień może przecinać się z obiektem quad, oto kod, którego używam do uzyskania promienia:

public Ray GetMouseRay()
    {
        Vector2 mousePosition = new Vector2(cursor.getX(), cursor.getY());

        Vector3 nearPoint = new Vector3(mousePosition, 0);
        Vector3 farPoint = new Vector3(mousePosition, 1);

        nearPoint = viewport.Unproject(nearPoint, projectionMatrix, viewMatrix, Matrix.Identity);
        farPoint = viewport.Unproject(farPoint, projectionMatrix, viewMatrix, Matrix.Identity);

        Vector3 direction = farPoint - nearPoint;
        direction.Normalize();

        return new Ray(nearPoint, direction);
    }

I podobnie jest to moja quadowa struktura, której używam do narysowania „świata sześcianów” w przestrzeni 3D. public struct Quad {public Vector3 Origin; public Vector3 UpperLeft; public Vector3 LowerLeft; public Vector3 UpperRight; public Vector3 LowerRight; public Vector3 Normalny; public Vector3 Up; public Vector3 Left;

    public VertexPositionNormalTexture[] Vertices;
      public int[] Indexes;
    public short[] Indexes;


    public Quad( Vector3 origin, Vector3 normal, Vector3 up, 
        float width, float height )
    {
        Vertices = new VertexPositionNormalTexture[4];
        Indexes = new short[6];
        Origin = origin;
        Normal = normal;
        Up = up;

        // Calculate the quad corners
        Left = Vector3.Cross( normal, Up );
        Vector3 uppercenter = (Up * height / 2) + origin;
        UpperLeft = uppercenter + (Left * width / 2);
        UpperRight = uppercenter - (Left * width / 2);
        LowerLeft = UpperLeft - (Up * height);
        LowerRight = UpperRight - (Up * height);

        FillVertices();
    }

    private void FillVertices()
    {
        // Fill in texture coordinates to display full texture
        // on quad
        Vector2 textureUpperLeft = new Vector2( 0.0f, 0.0f );
        Vector2 textureUpperRight = new Vector2( 1.0f, 0.0f );
        Vector2 textureLowerLeft = new Vector2( 0.0f, 1.0f );
        Vector2 textureLowerRight = new Vector2( 1.0f, 1.0f );

        // Provide a normal for each vertex
        for (int i = 0; i < Vertices.Length; i++)
        {
            Vertices[i].Normal = Normal;
        }

        // Set the position and texture coordinate for each
        // vertex
        Vertices[0].Position = LowerLeft;
        Vertices[0].TextureCoordinate = textureLowerLeft;
        Vertices[1].Position = UpperLeft;
        Vertices[1].TextureCoordinate = textureUpperLeft;
        Vertices[2].Position = LowerRight;
        Vertices[2].TextureCoordinate = textureLowerRight;
        Vertices[3].Position = UpperRight;
        Vertices[3].TextureCoordinate = textureUpperRight;

        // Set the index buffer for each vertex, using
        // clockwise winding
        Indexes[0] = 0;
        Indexes[1] = 1;
        Indexes[2] = 2;
        Indexes[3] = 2;
        Indexes[4] = 1;
        Indexes[5] = 3;
    }
}

Odkryłem, że klasa ray ma metodę przecina (), która przyjmujesamolot struct jako parametr, a struct struct przyjmuje normalną i odległość od początku w konstruktorze, ale moje samoloty mają pozycję i normę zamiast tylko odległości od początku, więc nie mogę ich przekonwertować. Jak mogę wykryć, czy mój ray przecina moją strukturę quad?

Edytuj: Zdaję sobie sprawę, że nie mogę użyć struktury płaszczyzny, ponieważ nie ma ona skończonego rozmiaru i nie zawiera rogów, jak to robi mój quad. Muszę teraz znaleźć sposób na wykrycie, czy ten promień przecina quad, który stworzyłem ...

Dziękuję za przeczytanie, zdaję sobie sprawę, że to pytanie jest trochę długie i z góry dziękuję.

questionAnswers(3)

yourAnswerToTheQuestion