I find the position X,Y,Z in the last column

I find the scaling X,Y,Z as the lengths the first three columns

I use the upper left 3x3 matrix as the rotation

~ Inv Scale ~ ~ Inv Rot ~ ~ Inv Pos ~ [1/X 0 0 0] [\.......] [1 0 0 -X] [ 0 1/Y 0 0] [..flip..] [0 1 0 -Y] [ 0 0 1/Z 0] [diagonal] [0 0 1 -Z] [ 0 0 0 1] [.......\] [0 0 0 1]

After combining the above matrices in that order, I come up with the following code with matrix A as the result:

(GL Matrix Indices) [0 4 8 12] [1 5 9 13] [2 6 10 14] [3 7 11 15] void invertMatrix (float A[], float B[]) { float sclX = lengthVector(&B[0]); float sclY = lengthVector(&B[4]); float sclZ = lengthVector(&B[8]); A[0] = B[0]/sclX; A[4] = B[1]/sclX; A[8] = B[2] /sclX; A[1] = B[4]/sclY; A[5] = B[5]/sclY; A[9] = B[6] /sclY; A[2] = B[8]/sclZ; A[6] = B[9]/sclZ; A[10] = B[10]/sclZ; A[3] = 0.0; A[7] = 0.0; A[11] = 0.0; float posX = -B[12], posY = -B[13], posZ = -B[14]; A[12] = A[0]*posX + A[4]*posY + A[8] *posZ; A[13] = A[1]*posX + A[5]*posY + A[9] *posZ; A[14] = A[2]*posX + A[6]*posY + A[10]*posZ; A[15] = 1.0; }

To test my inverse, I created a matrix with the following transform:

*Position*x=0, y=0, z=0

*Rotation*x=1, y=0, z=0

*Scaling*x=1, y=1, z=3

I multiply the inverse times the matrix, which always returns the scaling on the diagonal.

-- Object Matrix -- -- Inverse Matrix -- -- Inverse * Object -- [1.0 0.0 0.0 0.0] [1.0 0.0 0.0 -0.0] [1.0 0.0 0.0 0.0] [0.0 0.5 -2.5 0.0] [0.0 0.5 0.8 -0.0] [0.0 1.0 -0.0 0.0] [0.0 0.8 1.6 0.0] [0.0 -0.8 0.5 0.0] [0.0 0.0 3.0 0.0] [0.0 0.0 0.0 1.0] [0.0 0.0 0.0 1.0] [0.0 0.0 0.0 1.0]