/// <summary>
 /// 获取投影矩阵 dx风格, cvv为 x-1,1  y-1,1  z0,1
 /// </summary>
 /// <param name="fov">观察角,弧度</param>
 /// <param name="aspect">长宽比</param>
 /// <param name="zn">近裁z</param>
 /// <param name="zf">远裁z</param>
 /// <returns></returns>
 public static CMatrix4x4 GetProjection(float fov, float aspect, float zn, float zf)
 {
     CMatrix4x4 p = new CMatrix4x4();
     p.SetZero();
     p[0, 0] = (float)(1 / (System.Math.Tan(fov * 0.5f) * aspect));
     p[1, 1] = (float)(1 / System.Math.Tan(fov * 0.5f));
     p[2, 2] = zf / (zf - zn);
     p[2, 3] = 1f;
     p[3, 2] = (zn * zf) / (zn - zf);
     return p;
 }
        /// <summary>
        /// 获取投影矩阵 dx风格, cvv为 x-1,1  y-1,1  z0,1
        /// </summary>
        /// <param name="fov">观察角,弧度</param>
        /// <param name="aspect">长宽比</param>
        /// <param name="zn">近裁z</param>
        /// <param name="zf">远裁z</param>
        /// <returns></returns>
        public static CMatrix4x4 GetProjection(float fov, float aspect, float zn, float zf)
        {
            CMatrix4x4 p = new CMatrix4x4();

            p.SetZero();
            p[0, 0] = (float)(1 / (System.Math.Tan(fov * 0.5f) * aspect));
            p[1, 1] = (float)(1 / System.Math.Tan(fov * 0.5f));
            p[2, 2] = zf / (zf - zn);
            p[2, 3] = 1f;
            p[3, 2] = (zn * zf) / (zn - zf);
            return(p);
        }
 /// <summary>
 /// 矩阵乘法
 /// </summary>
 /// <param name="lhs"></param>
 /// <param name="rhs"></param>
 /// <returns></returns>
 public static CMatrix4x4 operator *(CMatrix4x4 lhs, CMatrix4x4 rhs)
 {
     CMatrix4x4 nm = new CMatrix4x4();
     nm.SetZero();
     for (int i = 0; i < 4; i++)
     {
         for (int j = 0; j < 4; j++)
         {
             for (int k = 0; k < 4; k++)
             {
                 nm._m[i, j] += lhs._m[i,k] * rhs._m[k, j];
             }
         }
     }
     return nm;
 }
        /// <summary>
        /// 矩阵乘法
        /// </summary>
        /// <param name="lhs"></param>
        /// <param name="rhs"></param>
        /// <returns></returns>
        public static CMatrix4x4 operator *(CMatrix4x4 lhs, CMatrix4x4 rhs)
        {
            CMatrix4x4 nm = new CMatrix4x4();

            nm.SetZero();
            for (int i = 0; i < 4; i++)
            {
                for (int j = 0; j < 4; j++)
                {
                    for (int k = 0; k < 4; k++)
                    {
                        nm._m[i, j] += lhs._m[i, k] * rhs._m[k, j];
                    }
                }
            }
            return(nm);
        }
 /// <summary>
 /// 获取旋转矩阵
 /// </summary>
 /// <param name="x"></param>
 /// <param name="y"></param>
 /// <param name="z"></param>
 /// <param name="r"></param>
 /// <returns></returns>
 public static CMatrix4x4 GetRotate(float x, float y, float z, float r)
 {
     CMatrix4x4 rm = new CMatrix4x4();
     rm.SetZero();
     rm[0, 0] = (float)(x * x * (1 - System.Math.Cos(r)) + System.Math.Cos(r));
     rm[0, 1] = (float)(x * y * (1 - System.Math.Cos(r)) +  z * System.Math.Sin(r));
     rm[0, 2] = (float)(x * z * (1 - System.Math.Cos(r)) - y * System.Math.Sin(r));
     //
     rm[1, 0] = (float)(y * x * (1 - System.Math.Cos(r)) - z * System.Math.Sin(r));
     rm[1, 1] = (float)(y * y * (1 - System.Math.Cos(r)) + System.Math.Cos(r));
     rm[1, 2] = (float)(y * z * (1 - System.Math.Cos(r)) + z * System.Math.Sin(r));
     //
     rm[2, 0] = (float)(z * x * (1 - System.Math.Cos(r)) + z * System.Math.Sin(r));
     rm[2, 1] = (float)(z * y * (1 - System.Math.Cos(r)) - System.Math.Sin(r));
     rm[2, 2] = (float)(z * z * (1 - System.Math.Cos(r)) + z * System.Math.Cos(r));
     return new CMatrix4x4();
 }
        /// <summary>
        /// 获取旋转矩阵
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <param name="z"></param>
        /// <param name="r"></param>
        /// <returns></returns>
        public static CMatrix4x4 GetRotate(float x, float y, float z, float r)
        {
            CMatrix4x4 rm = new CMatrix4x4();

            rm.SetZero();
            rm[0, 0] = (float)(x * x * (1 - System.Math.Cos(r)) + System.Math.Cos(r));
            rm[0, 1] = (float)(x * y * (1 - System.Math.Cos(r)) + z * System.Math.Sin(r));
            rm[0, 2] = (float)(x * z * (1 - System.Math.Cos(r)) - y * System.Math.Sin(r));
            //
            rm[1, 0] = (float)(y * x * (1 - System.Math.Cos(r)) - z * System.Math.Sin(r));
            rm[1, 1] = (float)(y * y * (1 - System.Math.Cos(r)) + System.Math.Cos(r));
            rm[1, 2] = (float)(y * z * (1 - System.Math.Cos(r)) + z * System.Math.Sin(r));
            //
            rm[2, 0] = (float)(z * x * (1 - System.Math.Cos(r)) + z * System.Math.Sin(r));
            rm[2, 1] = (float)(z * y * (1 - System.Math.Cos(r)) - System.Math.Sin(r));
            rm[2, 2] = (float)(z * z * (1 - System.Math.Cos(r)) + z * System.Math.Cos(r));
            return(new CMatrix4x4());
        }