public static Matrix ViewMatrix(Matrix M) { Vector3 CameraPosition = new Vector3(M[0, 0], M[1, 0], M[2, 0]); Vector3 CameraTarget = new Vector3(M[0, 1], M[1, 1], M[2, 1]); Vector3 UpVector = new Vector3(M[0, 2], M[1, 2], M[2, 2]); UpVector = UpVector.ToVersor(); Vector3 ZAxis = CameraPosition - CameraTarget; ZAxis = ZAxis.ToVersor(); Vector3 XAxis = Vector3.CrossProduct(UpVector, ZAxis); XAxis = XAxis.ToVersor(); Vector3 YAxis = Vector3.CrossProduct(ZAxis, XAxis); return(new Matrix(new double[, ] { { XAxis.first, XAxis.second, XAxis.third, 0 }, { YAxis.first, YAxis.second, YAxis.third, 0 }, { -ZAxis.first, -ZAxis.second, -ZAxis.third, 0 }, { -Vector3.DotProduct(XAxis, CameraPosition), -Vector3.DotProduct(YAxis, CameraPosition), Vector3.DotProduct(ZAxis, CameraPosition), 1 } })); }