Skip to content
Snippets Groups Projects

Inverse Matrix44

  • Clone with SSH
  • Clone with HTTPS
  • Embed
  • Share
    The snippet can be accessed without any authentication.
    Authored by Zandor Smith

    This will produce an inverse 4x4 matrix of the current instance.

    Matrix44.cpp 2.48 KiB
    bool igad::Matrix44::Invert() {
    	float determinant = Determinant();
    	if (determinant == 0)
    		return false;
     
    	float inv[16];
    	inv[0] = f[5] * f[10] * f[15] - f[5] * f[11] * f[14] - f[9] * f[6] * f[15] + f[9] * f[7] * f[14] + f[13] * f[6] * f[11] - f[13] * f[7] * f[10];
    	inv[1] = -f[1] * f[10] * f[15] + f[1] * f[11] * f[14] + f[9] * f[2] * f[15] - f[9] * f[3] * f[14] - f[13] * f[2] * f[11] + f[13] * f[3] * f[10];
    	inv[2] = f[1] * f[6] * f[15] - f[1] * f[7] * f[14] - f[5] * f[2] * f[15] + f[5] * f[3] * f[14] + f[13] * f[2] * f[7] - f[13] * f[3] * f[6];
    	inv[3] = -f[1] * f[6] * f[11] + f[1] * f[7] * f[10] + f[5] * f[2] * f[11] - f[5] * f[3] * f[10] - f[9] * f[2] * f[7] + f[9] * f[3] * f[6];
    	inv[4] = -f[4] * f[10] * f[15] + f[4] * f[11] * f[14] + f[8] * f[6] * f[15] - f[8] * f[7] * f[14] - f[12] * f[6] * f[11] + f[12] * f[7] * f[10];
    	inv[5] = f[0] * f[10] * f[15] - f[0] * f[11] * f[14] - f[8] * f[2] * f[15] + f[8] * f[3] * f[14] + f[12] * f[2] * f[11] - f[12] * f[3] * f[10];
    	inv[6] = -f[0] * f[6] * f[15] + f[0] * f[7] * f[14] + f[4] * f[2] * f[15] - f[4] * f[3] * f[14] - f[12] * f[2] * f[7] + f[12] * f[3] * f[6];
    	inv[7] = f[0] * f[6] * f[11] - f[0] * f[7] * f[10] - f[4] * f[2] * f[11] + f[4] * f[3] * f[10] + f[8] * f[2] * f[7] - f[8] * f[3] * f[6];
    	inv[8] = f[4] * f[9] * f[15] - f[4] * f[11] * f[13] - f[8] * f[5] * f[15] + f[8] * f[7] * f[13] + f[12] * f[5] * f[11] - f[12] * f[7] * f[9];
    	inv[9] = -f[0] * f[9] * f[15] + f[0] * f[11] * f[13] + f[8] * f[1] * f[15] - f[8] * f[3] * f[13] - f[12] * f[1] * f[11] + f[12] * f[3] * f[9];
    	inv[10] = f[0] * f[5] * f[15] - f[0] * f[7] * f[13] - f[4] * f[1] * f[15] + f[4] * f[3] * f[13] + f[12] * f[1] * f[7] - f[12] * f[3] * f[5];
    	inv[11] = -f[0] * f[5] * f[11] + f[0] * f[7] * f[9] + f[4] * f[1] * f[11] - f[4] * f[3] * f[9] - f[8] * f[1] * f[7] + f[8] * f[3] * f[5];
    	inv[12] = -f[4] * f[9] * f[14] + f[4] * f[10] * f[13] + f[8] * f[5] * f[14] - f[8] * f[6] * f[13] - f[12] * f[5] * f[10] + f[12] * f[6] * f[9];
    	inv[13] = f[0] * f[9] * f[14] - f[0] * f[10] * f[13] - f[8] * f[1] * f[14] + f[8] * f[2] * f[13] + f[12] * f[1] * f[10] - f[12] * f[2] * f[9];
    	inv[14] = -f[0] * f[5] * f[14] + f[0] * f[6] * f[13] + f[4] * f[1] * f[14] - f[4] * f[2] * f[13] - f[12] * f[1] * f[6] + f[12] * f[2] * f[5];
    	inv[15] = f[0] * f[5] * f[10] - f[0] * f[6] * f[9] - f[4] * f[1] * f[10] + f[4] * f[2] * f[9] + f[8] * f[1] * f[6] - f[8] * f[2] * f[5];
     
    	determinant = 1.0 / determinant;
     
    	for (int i = 0; i < sizeof f / sizeof *f; i++)
    		f[i] = inv[i] * determinant;
    	
    	return true;
    }
    0% Loading or .
    You are about to add 0 people to the discussion. Proceed with caution.
    Finish editing this message first!
    Please register or to comment