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