Matrix Transformations

In order to transform a set of vectors from one coordinate space to another, we can perform linear transformations (scales, translations, and rotations) among different Cartesian coordinate frames.

See:

Handedness

A left-handed matrix transform has the following shape: \[ \begin{bmatrix} U_x & U_y & U_z & 0 \\ V_x & V_y & V_z & 0 \\ W_x & W_y & W_z & 0 \\ T_x & T_y & T_z & 1 \end{bmatrix} \]

Whereas a right-handed matrix transform has the following shape: \[ \begin{bmatrix} U_x & V_x & W_x & T_x \\ U_y & V_y & W_y & T_y \\ U_z & V_z & W_z & T_z \\ 0 & 0 & 0 & 1 \end{bmatrix} \]

In the above matrices, the vectors \(\vec{U}\), \(\vec{V}\), \(\vec{W}\) represent the basis vectors in the resulting coordinate system as it appears to the source coordinate system. Together they constitute how the vector is to be rotated.

The vector \(\vec{T}\) represents a translation.

How to apply matrix transforms to a vector

Order matters when transforming a vector using a matrix because the operation is not commutative.

In other words: \(\vec{V} \times M \ne M \times \vec{V}\)

WHEN THE TRANSFORM MATRIX IS LEFT-HANDED, THE VECTOR GOES ON THE LEFT SIDE \[\vec{V'} = \vec{V} \times M_{LH}\]

WHEN THE TRANSFORM MATRIX IS RIGHT-HANDED, THE VECTOR GOES ON THE RIGHT SIDE \[\vec{V'} = M_{RH} \times \vec{V}\]

Coordinate Systems

A coordinate system \( C \) consists of an origin and three coordinate axes. Points have coordinates \( \langle x, y, z \rangle \). You can think of a point's coordinates as the distance to travel along each coordinate axis from the origin to reach the point.

A transformation matrix converts vectors from a source space \( A \) to target space \( B \). As explained above and below, the \(\vec{U}\), \(\vec{V}\), \(\vec{W}\) vectors represent the basis vectors of space \(B\) as it appears when viewing them from space \(A\).

You can construct any such transformation matrix on your own; the coordinate space that the \(\vec{U}\), \(\vec{V}\), \(\vec{W}\) vectors are defined in dictate what target space the transformation matrix transforms vectors into.

Linear Transformations

If you have a \( C \), you could also have \( C' \), which is a second coordinate system with coordinates \( \langle x', y', z' \rangle \) that _can be expressed as linear functions of coordinates \( \langle x, y, z \rangle \) in \( C \).

\[ x'(x, y, z) = U_1 x + V_1 y + W_1 z + T_1 \] \[ y'(x, y, z) = U_2 x + V_2 y + W_2 z + T_2 \] \[ z'(x, y, z) = U_3 x + V_3 y + W_3 z + T_3 \]

The above is a linear transformation from \( C \) to \( C' \) and can be written in matrix form:

\[ \begin{bmatrix} x' \\ y' \\ z' \end{bmatrix} = \begin{bmatrix} U_1 & V_1 & W_1 \\ U_2 & V_2 & W_2 \\ U_3 & V_3 & W_3 \end{bmatrix} \begin{bmatrix} x \\ y \\ z \end{bmatrix} + \begin{bmatrix} T_1 \\ T_2 \\ T_3 \end{bmatrix} \]

The coordinates \( \langle x', y', z' \rangle \) is the distance to travel along each coordinate axis in \( C' \) to reach the same point \( P \) which in \( C \) is \( \langle x, y, z \rangle \).

Column vector \( \vec{T} \) is the translation from the origin of \( C \) to \( C' \).

The matrix with vectors \( \vec{U} \), \( \vec{V} \), \( \vec{W} \) represents how the orientation of the coordinate axes changes when transforming from \( C \) to \( C' \).

All four vectors \( \vec{T} \), \( \vec{U} \), \( \vec{V} \), \( \vec{W} \) can be combined into a 4x4 matrix.

If a linear transformation can be inverted, it would look like this:

\[ \begin{bmatrix} x \\ y \\ z \end{bmatrix} = \begin{bmatrix} U_1 & V_1 & W_1 \\ U_2 & V_2 & W_2 \\ U_3 & V_3 & W_3 \end{bmatrix}^{-1} \left( \begin{bmatrix} x' \\ y' \\ z' \end{bmatrix} - \begin{bmatrix} T_1 \\ T_2 \\ T_3 \end{bmatrix} \right) \]

Transforming with Orthogonal Matrices

When an orthogonal matrix transforms a vertex, it preserves lengths and angles.

\[ \lVert MP \rVert = \lVert P \rVert \] \[ \left( M P_1 \right) \cdot \left( M P_2 \right) = P_1 \cdot P_2 \]

Orthogonal matrices therefore preserve the overall structure of a coordinate system as it transforms vertices to another coordinate system. They can only represent either rotations or reflections.

A reflection transform occurs when points are mirrored in a certain direction.

Reflects z coordinates of a point across the x-y plane

\[ \begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & -1 \end{bmatrix} \]

Transform Types

Scaling

To scale \( \vec{P} \), we just multiply it by a scalar \( a \).

Uniform scaling:

\[ \vec{P'} = \begin{bmatrix} a & 0 & 0 \\ 0 & a & 0 \\ 0 & 0 & a \end{bmatrix} \begin{bmatrix} P_x \\ P_y \\ P_z \end{bmatrix} \]

Non-uniform scaling:

\[ \vec{P'} = \begin{bmatrix} a & 0 & 0 \\ 0 & b & 0 \\ 0 & 0 & c \end{bmatrix} \begin{bmatrix} P_x \\ P_y \\ P_z \end{bmatrix} \]

Scaling applied in arbitrary axes:

Suppose you want to scale \( \vec{P} \) by factor \( a \) along axis \( \vec{U} \), by factor \( b \) along axis \( \vec{V} \), and by factor \( c \) along axis \( \vec{W} \)

\[ \vec{P'} = \begin{bmatrix} U_x & V_x & W_x \\ U_y & V_y & W_y \\ U_z & V_z & W_z \end{bmatrix} \begin{bmatrix} a & 0 & 0 \\ 0 & b & 0 \\ 0 & 0 & c \end{bmatrix} \begin{bmatrix} U_x & V_x & W_x \\ U_y & V_y & W_y \\ U_z & V_z & W_z \end{bmatrix}^{-1} \begin{bmatrix} P_x \\ P_y \\ P_z \end{bmatrix} \]

Rotation

Given an angle \( \theta \) and an axis to rotate around, you can determine a 3x3 matrix that represents the rotation.

\[ \vec{R}_x(\theta) = \begin{bmatrix} 1 & 0 & 0 \\ 0 & cos \theta & -sin \theta \\ 0 & sin \theta & cos \theta \end{bmatrix} \] \[ \vec{R}_y(\theta) = \begin{bmatrix} cos \theta & 0 & sin \theta \\ 0 & 1 & 0 \\ -sin \theta & 0 & cos \theta \end{bmatrix} \] \[ \vec{R}_z(\theta) = \begin{bmatrix} cos \theta & -sin \theta & 0 \\ sin \theta & cos \theta & 0 \\ 0 & 0 & 1 \end{bmatrix} \]

Rotation applied to arbitrary axis:

A is the arbitrary axis around which to rotate.

\[ \vec{R}_A(\theta) = \begin{bmatrix} c + (1-c) A_x^2 & (1-c) A_x A_y - s A_z & (1-c) A_x A_z + s A_y \\ (1-c) A_x A_y + s A_z & c + (1-c) A_y^2 & (1-c) A_y A_z - s A_x \\ (1-c) A_x A_z - s A_y & (1-c) A_y A_z + s A_x & c + (1-c) A_z^2 \end{bmatrix} \] where \( c = cos \theta \) and \( s = sin \theta \)

Rotations depend on the handedness of your coordinate system!

The above formulas assume a right-handed coordinate system.

The following are the left-handed equivalents:

\[ \vec{R}_x(\theta) = \begin{bmatrix} 1 & 0 & 0 \\ 0 & cos \theta & sin \theta \\ 0 & -sin \theta & cos \theta \end{bmatrix} \] \[ \vec{R}_y(\theta) = \begin{bmatrix} cos \theta & 0 & -sin \theta \\ 0 & 1 & 0 \\ sin \theta & 0 & cos \theta \end{bmatrix} \] \[ \vec{R}_z(\theta) = \begin{bmatrix} cos \theta & sin \theta & 0 \\ -sin \theta & cos \theta & 0 \\ 0 & 0 & 1 \end{bmatrix} \]

Homogenous Coordinates

Without utilizing 4D coordinates (and thereby homogenous coordinates), in order to both rotate/scale and translate a vector, we'd have to do something like this:

\[ \vec{P'} = M \vec{P} + \vec{T} \]

A 3D vector can be turned into a 4D homogenous coordinates by setting its fourth component \( w \) to 1 or 0. You would use 1 if the vector is a point, meaning that it indicates an actual position in 3D space. You would use 0 if the vector is a direction, meaning translations should have no effect..

\[ F = \left[ \begin{array}{ccc|c} U_x & V_x & W_x & T_x \\ U_y & V_y & W_y & T_y \\ U_z & V_z & W_z & T_z \\ \hline 0 & 0 & 0 & 1 \end{array} \right] \]

To convert a point from its homogenous coordinates back into its 3D vector.

\[ \vec{P'} = \langle \frac{x}{w}, \frac{y}{w}, \frac{z}{w} \rangle \]

Normal Vectors

You have to be careful when transforming a normal vector.

  • Normals should be unaffected by translations.
  • When a nonorthogonal matrix transforms a normal vector, it may result in a direction that is no longer perpendicular to the surface.

Matrix Concatenation

Matrix concatenation goes from left to right.

Given a transformation matrix \(A\) and a transformation matrix \(B\):

\(AB\) results in a transformation matrix that encodes the combined effect of first applying matrix A to a vector, followed by applying matrix B.

\(BA\) has the opposite effect: it encodes the effect of applying matrix B, followed by applying matrix A.

And of course, since matrix multiplication is not commutative, \(AB \ne BA \).

Example

Given:

Matrix A is a 90 degree rotation about the y-axis (left-handed). \[A = \begin{bmatrix} 0 & 0 & -1 & 0 \\ 0 & 1 & 0 & 0 \\ 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}\]

Matrix B is a translation (left-handed).

\[B = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 3 & 4 & 5 & 1 \end{bmatrix}\]

Therefore: \[AB = \begin{bmatrix} 0 & 0 & -1 & 0 \\ 0 & 1 & 0 & 0 \\ 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 3 & 4 & 5 & 1 \end{bmatrix} = \begin{bmatrix} 0 & 0 & -1 & 0 \\ 0 & 1 & 0 & 0 \\ 1 & 0 & 0 & 0 \\ 3 & 4 & 5 & 1 \end{bmatrix} \]

\[BA = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 3 & 4 & 5 & 1 \end{bmatrix} \begin{bmatrix} 0 & 0 & -1 & 0 \\ 0 & 1 & 0 & 0 \\ 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} = \begin{bmatrix} 0 & 0 & -1 & 0 \\ 0 & 1 & 0 & 0 \\ 1 & 0 & 0 & 0 \\ 5 & 4 & -3 & 1 \end{bmatrix} \]