Game Development Reference
It is important to realize that matrix multiplication of all kinds is not commu-
tative; in general ab
ba . In particular, to multiply two matrices the number of
columns in the first matrix needs to be the same as the number of rows in the second.
So if we wanted to do
where M is a 3
3matrixand v is a three-element vector, we would have a mis-
match. The vector has one column, and the matrix has three rows. We cannot perform
this multiplication: it is undefined. Some game engines do use a pre-multiplication
scheme, but they do so by treating vectors as having one row and three columns,
[ xyz ]
rather than the column form we have used. With a row vector we can perform
pre-multiplication, but not post-multiplication. Confusingly, I have also seen pre-
multiplication mathematics written with the vector after the matrix (i.e., a matrix
and then a row vector), so it's worth taking care if you are working with existing code.
I will use post-multiplication and column vectors exclusively in this topic. If you are
working with an engine that uses pre-multiplication, you will have to adapt the order
of your code accordingly.
The result of matrix multiplication is a new matrix with the same number of
rows as the first matrix in the multiplication, and the same number of columns as the
second. So, if we multiply a 3
1 vector, we get a matrix with three
rows and one column (i.e., another vector). If we multiply a 3
3 matrix by another
If we are multiplying matrices A and B to give matrix C , each element in C is
found by the formula
C (i,j) =
A (i,k) B (k,j)
where C (i,j) is the entry in matrix C at the i th row and the j th column, and where k
ranges up to the number of columns in the first matrix (i.e., the number of rows in
the second—this is why they need to be the same).
For a 3
3 matrix multiplied by a vector we get
With this result we can implement multiplication of a vector by a matrix. I have over-
loaded the * operator for the matrix class to perform this.
Excerpt from include/cyclone/core.h
* Holds an inertia tensor, consisting of a 3x3 row-major matrix.