# Matrix for rotation around a vector

I'm trying to figure out the general form for the matrix (let's say in $\mathbb R^3$ for simplicity) of a rotation of $\theta$ around an arbitrary vector $v$ passing through the origin (look towards the origin and rotate counterclockwise). This is inspired by a similar problem which asked me to find the matrix for a rotation of $120^\circ$ around the vector $v=\begin{bmatrix}1&1&1\end{bmatrix}^\top$. However, in this case I was able to cheat a little since the transformation corresponds to a rotation of the vertices. So even though I found a solution, I'm not satisfied with my methodology. Is there a general form for rotation around an arbitrary vector in $\mathbb R^3$? A reference would be perfectly acceptable. Thanks.

-
Look up the Rodrigues rotation formula. –  Guess who it is. May 8 '12 at 21:14
That's exactly what I'm looking for. Thanks. –  chris May 8 '12 at 21:35

To settle this question: one can use the Rodrigues rotation formula to construct the rotation matrix that rotates by an angle $\varphi$ about the unit vector $\mathbf{\hat u}=\langle u_x,u_y,u_z\rangle$ (and if your vector is not a unit vector, normalization does the trick). Letting

$$\mathbf W=\begin{pmatrix}0&-u_z&u_y\\u_z&0&-u_x\\-u_y&u_x&0\end{pmatrix}$$

the Rodrigues rotation matrix is constructed as

$$\mathbf I+\left(\sin\,\varphi\right)\mathbf W+\left(2\sin^2\frac{\varphi}{2}\right)\mathbf W^2$$

where $\mathbf I$ is an identity matrix.

Conventionally, the scalar multiplying the $\mathbf W^2$ term above is written as $1-\cos\,\varphi$, but this version is more prone to subtractive cancellation when $\varphi$ is near $2k\pi$ ($k$ is an integer), so the expression with the sine is more numerically sound.

-

Using $2 \sin^2(th/2)$ is a bad idea in practice - numerical differences cause the rotation matrix to rescale what's being rotated. Using $1 - \cos(th)$ avoids this mismatch. (I speak from experience of trying both in creating a virtual trackball controller).

-