public static Vector3[] ProjectFrustumOnXZPlane(this Camera camera)
        {
            Plane plane = new Plane(Vector3.up, Vector3.zero);

            Plane[] planes = GeometryUtility.CalculateFrustumPlanes(camera);
            Line    L0;

            MUtils.Intersects(planes[0], plane, out L0);
            Line L1;

            MUtils.Intersects(planes[1], plane, out L1);
            Line L2;

            MUtils.Intersects(planes[2], plane, out L2);
            Line L3;

            MUtils.Intersects(planes[3], plane, out L3);

            Line2D l2d0 = MappingAxis.Map(L0);
            Line2D l2d1 = MappingAxis.Map(L1);
            Line2D l2d2 = MappingAxis.Map(L2);
            Line2D l2d3 = MappingAxis.Map(L3);

            float s, t;

            l2d0.Intersects(l2d2, out t, out s);
            Vector3 rightTop = MappingAxis.Map(l2d0.GetPoint(t));

            l2d0.Intersects(l2d3, out t, out s);
            Vector3 rightBottom = MappingAxis.Map(l2d0.GetPoint(t));

            l2d1.Intersects(l2d2, out t, out s);
            Vector3 leftTop = MappingAxis.Map(l2d1.GetPoint(t));

            l2d1.Intersects(l2d3, out t, out s);
            Vector3 leftBottom = MappingAxis.Map(l2d1.GetPoint(t));

            return(new Vector3[] { leftTop, rightTop, rightBottom, leftBottom });
        }