public TMat4x4 FindInverseMat() { float Det; float[,] C = new float[4, 4]; C[0, 0] = m11 * (m22 * m33 - m23 * m32) - m12 * (m21 * m33 - m23 * m31) + m13 * (m21 * m32 - m22 * m31); C[0, 1] = -(m10 * (m22 * m33 - m23 * m32) - m12 * (m20 * m33 - m23 * m30) + m13 * (m20 * m32 - m22 * m30)); C[0, 2] = m10 * (m21 * m33 - m23 * m31) - m11 * (m20 * m33 - m23 * m30) + m13 * (m20 * m31 - m21 * m30); C[0, 3] = 0; C[1, 0] = -(m01 * (m22 * m33 - m23 * m32) - m02 * (m21 * m33 - m23 * m31) + m03 * (m21 * m32 - m22 * m31)); C[1, 1] = m00 * (m22 * m33 - m23 * m32) - m02 * (m20 * m33 - m23 * m30) + m03 * (m20 * m32 - m22 * m30); C[1, 2] = -(m00 * (m21 * m33 - m23 * m31) - m01 * (m20 * m33 - m23 * m30) + m03 * (m20 * m31 - m21 * m30)); C[1, 3] = 0; C[2, 0] = m01 * (m12 * m33 - m13 * m32) - m02 * (m11 * m33 - m13 * m31) + m03 * (m11 * m32 - m12 * m31); C[2, 1] = -(m00 * (m12 * m33 - m13 * m32) - m02 * (m10 * m33 - m13 * m30) + m03 * (m10 * m32 - m12 * m30)); C[2, 2] = m00 * (m11 * m33 - m13 * m31) - m01 * (m10 * m33 - m13 * m30) + m03 * (m10 * m31 - m11 * m30); C[2, 3] = 0; C[3, 0] = -(m01 * (m12 * m23 - m13 * m22) - m02 * (m11 * m23 - m13 * m21) + m03 * (m11 * m22 - m12 * m21)); C[3, 1] = m00 * (m12 * m23 - m13 * m22) - m02 * (m10 * m23 - m13 * m20) + m03 * (m10 * m22 - m12 * m20); C[3, 2] = -(m00 * (m11 * m23 - m13 * m21) - m01 * (m10 * m23 - m13 * m20) + m03 * (m10 * m21 - m11 * m20)); C[3, 3] = m00 * (m11 * m22 - m12 * m21) - m01 * (m10 * m22 - m12 * m20) + m02 * (m10 * m21 - m11 * m20); Det = 0; // Create a temporary array in order to ease calculations float[,] TmpM = ConvertToArray(); for (int i = 0; i < 4; i++) { Det += TmpM[0, i] * C[0, i]; } float[,] Result = new float[4, 4]; for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { Result[i, j] = C[j, i] / Det; } } Result[3, 3] = 1; for (int i = 0; i < 4; i++) { Result[i, 3] = 0; Result[3, i] = 0; for (int j = 0; j < 4; j++) { Result[3, i] = Result[3, i] + TmpM[3, j] * Result[j, i]; } Result[3, i] = -Result[3, i]; } TMat4x4 InverseMat = ZeroMat(); InverseMat.ConvertFromArray(Result); return(InverseMat); }