*In which you learn how rotation can be expressed in terms of dot products.*

Writing scale as a dot product probably seemed a little backward. It took a very simple multiplication and turned it into something more complex. Hopefully rotation will seem more natural. Rotating point \(\mathbf{p}\) by \(a\) radians around the z-axis produces point \(\mathbf{p'}\) with the following components:

$$ \begin{aligned} p'_x &= \cos a \times p_x - \sin a \times p_y \\ p'_y &= \sin a \times p_x + \cos a \times p_y \\ p'_z &= p_z \end{aligned} $$

Unlike scaling, the definitions of \(p'_x\) and \(p'_y\) actually look like dot products. You are multiplying and summing the components of \(\mathbf{p}\).

As with scaling, you want to rewrite the equations above to use dot products. They will have this form:

$$ \begin{aligned} p'_x &= \mathbf{a} \cdot \mathbf{p} \\ p'_y &= \mathbf{b} \cdot \mathbf{p} \\ p'_z &= \mathbf{c} \cdot \mathbf{p} \end{aligned} $$

The first two components of \(\mathbf{a}\) are plucked right from the scalar definition of \(p'_x\). There's no mention of \(p_z\), so it must be zeroed out. Vector \(\mathbf{b}\) is derived similarly. You've got this much figured out:

$$ \begin{aligned} p'_x &= \begin{bmatrix}\cos a & -\sin a & 0\end{bmatrix} \cdot \mathbf{p} \\ p'_y &= \begin{bmatrix}\sin a & \cos a & 0\end{bmatrix} \cdot \mathbf{p} \\ \end{aligned} $$

The scalar definition of \(p'_z\) does not look like a dot product. Nonetheless, it can be written as one. The x- and y-components are zeroed out, and \(p_z\) stays the same, which means its coefficient in the dot product machinery must be 1:

$$ \begin{aligned} p'_z &= \begin{bmatrix}0 & 0 & 1\end{bmatrix} \cdot \mathbf{p} \end{aligned} $$

Altogether, a rotation around the z-axis has this dot product form:

$$ \begin{aligned} p'_x &= \begin{bmatrix}\cos a & -\sin a & 0\end{bmatrix} \cdot \mathbf{p} \\ p'_y &= \begin{bmatrix}\sin a & \cos a & 0\end{bmatrix} \cdot \mathbf{p} \\ p'_z &= \begin{bmatrix}0 & 0 & 1\end{bmatrix} \cdot \mathbf{p} \end{aligned} $$

Two transformations down, one to go. Can you make it work for translation?