To main page | 3dengine.org

# Matrix Math

Matrix math is presented for row-major matrices. Please note that OpenGL stores matrices in column-major order.

## Addition of matrices

Just add the corresponding elements:

## Multiplication of matrices

Rules:

Matrix A multiplied by matrix B is not the same as matrix B multiplied by A.

Matrix A multiplied by matrix B assumes right-multiplication (i.e. B goes to the right of A).

The size of matrix is 2x3 means it has 2 rows of numbers and 3 columns.

The number of columns must be equal to number of rows in second matrix.

If the size of matrix A is 2x3 and matrix B is 3x4 then the result is 2x4:**2**x3 x 3x**4** = 2x4. (In most cases OpenGL matrices are 4x4 and result of multiplication of two 4x4 matrices is 4x4 matrix).

To find element 3,2 of new matrix: multiply 3rd LINE of matrix A by 2nd COLUMN of matrix B.

**Always multiply line by column**

## Transpose

Matrix Transpose is basically flipping a matrix along it's diagonal. It converts row-major to column-major matrices and vice versa.

**The diagonal** of both matrices is elements [0 5 10 15].

Matrix math is presented for row-major matrices. Please note that OpenGL stores matrices in column-major order.

[0 1 2] [6 7 8] [0+6 1+7 2+8] [6 8 10] [3 4 5] + [9 10 11] = [3+9 4+10 5+11] = [12 14 16]

Matrix A multiplied by matrix B is not the same as matrix B multiplied by A.

Matrix A multiplied by matrix B assumes right-multiplication (i.e. B goes to the right of A).

The size of matrix is 2x3 means it has 2 rows of numbers and 3 columns.

The number of columns must be equal to number of rows in second matrix.

If the size of matrix A is 2x3 and matrix B is 3x4 then the result is 2x4:

To find element 3,2 of new matrix: multiply 3rd LINE of matrix A by 2nd COLUMN of matrix B.

[0 1 2] [6 7 ] [0*6+1*8+2*10 0*7+1*9+2*11] [28 31] [3 4 5] x [8 9 ] = [3*6+4*8+5*10 3*7+4*9+5*11] = [100 112] [10 11]OpenGL math is the same:

GLfloat m1[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; glmeaning:LoadMatrixf(m1); GLfloat m2[] = {16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31}; glMultMatrixf(m2); // result in current matrix will be {440,510,580,650,536,.... see below

[ 0 4 8 12 ] [ 16 20 24 28 ] [ 440 536 632 728 ] [ 1 5 9 13 ] x [ 17 21 25 29 ] = [ 510 622 734 846 ] [ 2 6 10 14 ] [ 18 22 26 30 ] [ 580 708 836 964 ] [ 3 7 11 15 ] [ 19 23 27 31 ] [ 650 794 938 1082 ] 440 = 0*16 + 4*17 + 8*18 + 12*19 : 1st line [0 4 8 12] by 1st column [16 17 18 19]

[ 0 1 2 3 ] T [ 0 4 8 12 ] [ 4 5 6 7 ] [ 1 5 9 13 ] [ 8 9 10 11 ] = [ 2 6 10 14 ] [ 12 13 14 15 ] [ 3 7 11 15 ]