Game Development Reference
In-Depth Information
data[6]*o.data[0] + data[7]*o.data[3] + data[8]*o.data[6],
data[6]*o.data[1] + data[7]*o.data[4] + data[8]*o.data[7],
data[6]*o.data[2] + data[7]*o.data[5] + data[8]*o.data[8]
);
}
};
Multiplying two matrices together in this way combines their effects. If matrices
A and B are two transformations, then the matrix AB will represent the combined
transformation. Order is crucial for both transformations and matrix multiplication:
the matrix AB is a transformation that would result from first doing B and then do-
ing A . In other words, the order of the transformations is the opposite of the order
of the matrices in the multiplication. This is a “gotcha” that catches even experienced
developers from time to time.
So much for 3
×
×
4 matrices? From the rules of matrix
multiplication we can't multiply two 3
4 matrices together: the columns of the first
matrix don't match the rows of the second. To make progress we need to return to the
full form of our 4
×
×
4 matrix. Remember that the matrix we are storing as
abcd
ef gh
ijkl
can be thought of as shorthand for
abcd
ef gh
ijkl
0001
×
×
4
matrices with [0 0 0 1] as their bottom line, we end up with another matrix whose
bottomlineis[0001](tryittoconvinceyourself).
So in our code, when we come to multiply two 3
We can certainly multiply two 4
4 matrices together. If we multiply two 4
×
4 matrices (to combine their
transformations), we magically make the extra values appear, without storing them,
exactly as we did for transforming vectors. The code looks like this:
Excerpt from include/cyclone/core.h
/**
* Holds a transform matrix, consisting of a rotation matrix and
* a position. The matrix has 12 elements; it is assumed that the
* remaining four are (0,0,0,1), producing a homogenous matrix.