Пересечение лучей с трехмерными квадраторами в XNA?

Итак, я успешно сделал луч, который представляет мышь, не спроецированную в мир, и теперь мне нужно проверить, может ли этот луч пересекаться с четырехугольным объектом, вот код, который я использую для получения луча:

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

И, аналогично, это моя четырехугольная структура, которую я использую, чтобы нарисовать "куб мира " в трехмерном пространстве. публичная структура Quad {публичный Vector3 Origin; общедоступный Vector3 UpperLeft; общедоступный Vector3 LowerLeft; общедоступный Vector3 UpperRight; общедоступный Vector3 LowerRight; общедоступный Vector3 Normal; общедоступный Vector3 Up; общедоступный 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;
    }
}

Я обнаружил, что в классе лучей есть метод intersects (), который принимаетсамолет struct в качестве параметра, и плоскостная структура принимает нормаль и расстояние от начала координат в конструкторе, но мои плоскости имеют позицию и нормаль, а не просто расстояние от начала координат, поэтому я могуконвертировать их. Как я могу определить, что мой луч пересекает мою четырехугольную структуру?

Редактировать: я понимаю, что могуЯ не использую плоскую структуру, поскольку она не имеет конечного размера и не включает в себя углы, как это делает мой четырехугольник. Теперь мне нужно найти способ определить, пересекает ли этот луч четырехугольник, который я создал ...

Спасибо за чтение, я понимаю, что этот вопрос немного длинен, и спасибо заранее.

Ответы на вопрос(3)

Ваш ответ на вопрос