Scaling along the cardinal axes

Intuitively the basis vectors should be multiplied by an scalar, also they are independently affected by the scale factors

In 2D the basis vectors become

$$ \mathbf{p'} = k_x \mathbf{p} = k_x \begin{bmatrix} 1 \\ 0 \end{bmatrix} = \begin{bmatrix} k_x \\ 0 \end{bmatrix} \\ \mathbf{q'} = k_y \mathbf{q} = k_y \begin{bmatrix} 0 \\ 1 \end{bmatrix} = \begin{bmatrix} 0 \\ k_y \end{bmatrix} $$

Constructing the 2D scale matrix $\mathbf{S}(k_x, k_y)$ from these basis vectors

$$ \mathbf{S}(k_x, k_y) = \begin{bmatrix} k_x & 0 \\ 0 & k_y \end{bmatrix} $$

Similarly the 3D scale matrix is given by

$$ \mathbf{S}(k_x, k_y, k_z) = \begin{bmatrix} k_x & 0 & 0 \\ 0 & k_y & 0 \\ 0 & 0 & k_z \end{bmatrix} $$

Scaling along an arbitrary axis

Let $\unit{n}$ be the unit vector parallel to the direction of scale and $k$ to be the scale factor, a vector transformed by this scale operations can be represented as

$$ \mathbf{v'} = \mathbf{S}(\unit{n}, k) \mathbf{v} $$
scale arbitrary axis

scale arbitrary axis

Separate $\mathbf{v}$ in two vectors, a vector parallel to $\unit{v}$ called $\mathbf{v_{\parallel}}$ and a vector perpendicular to $\unit{v}$ called $\mathbf{v_{\perp}}$ such that

$$ \mathbf{v} = \mathbf{v_{\parallel}} + \mathbf{v_{\perp}} $$

Where

$$ \begin{align*} \mathbf{v_{\parallel}} &= (\mathbf{v} \cdot \unit{n}) \unit{n} \\ \mathbf{v_{\perp}} &= \mathbf{v} - \mathbf{v_{\parallel}} \end{align*} $$

We can also represent $\mathbf{v’}$ as a sum of two vectors parallel and perpendicular to $\unit{n}$

$$ \mathbf{v'} = \mathbf{v_{\parallel}'} + \mathbf{v_{\perp}'} $$

Note that any vector that lies in the 2d line or 3d plane perpendicular to $\unit{n}$ will not be affected by the scale operation so $\mathbf{v’} = \mathbf{v_{\parallel}'} + \mathbf{v_{\perp}}$

Since $\mathbf{v_{\parallel}}$ is parallel to the direction of scale then $\mathbf{v_{\parallel}'} = k\mathbf{v_{\parallel}}$

Reconstructing the solution from the observations above

$$ \begin{align*} \mathbf{v_{\parallel}} &= (\mathbf{v} \cdot \unit{n}) \unit{n} \\ \mathbf{v_{\perp}'} &= \mathbf{v_{\perp}} \\ &= \mathbf{v} - \mathbf{v_{\parallel}} \\ &= \mathbf{v} - (\mathbf{v} \cdot \unit{n}) \unit{n} \\ \mathbf{v_{\parallel}'} &= k\mathbf{v_{\parallel}} \\ &= k(\mathbf{v} \cdot \unit{n}) \unit{n} \\ \mathbf{v'} &= \mathbf{v_{\perp}'} + \mathbf{v_{\parallel}'} \\ &= \mathbf{v} - (\mathbf{v} \cdot \unit{n}) \unit{n} + k(\mathbf{v} \cdot \unit{n}) \unit{n} \\ &= \mathbf{v} + (k - 1) (\mathbf{v} \cdot \unit{n}) \unit{n} \end{align*} $$

We can construct a general scale matrix by computing the vectors resulting after transforming the basis vectors $\mathbf{p}$, $\mathbf{q}$ and $\mathbf{r}$, for example let’s transform $\mathbf{p} = \begin{bmatrix} 1 & 0 & 0 \end{bmatrix}^T$

$$ \begin{align*} \mathbf{p'} &= \mathbf{p} + (k - 1) (\mathbf{p} \cdot \unit{n}) \unit{n} \\ &= \begin{bmatrix} 1 \\ 0 \\ 0 \end{bmatrix} + (k - 1) \left ( \begin{bmatrix} 1 \\ 0 \\ 0 \end{bmatrix} \begin{bmatrix} n_x \\ n_y \\ n_z \end{bmatrix}^T \right ) \begin{bmatrix} n_x \\ n_y \\ n_z \end{bmatrix} \\ &= \begin{bmatrix} 1 \\ 0 \\ 0 \end{bmatrix} + (k - 1) n_x \begin{bmatrix} n_x \\ n_y \\ n_z \end{bmatrix} \\ &= \begin{bmatrix} 1 + (k - 1) {n_x}^2 \\ (k - 1)n_xn_y \\ (k - 1)n_xn_z \end{bmatrix} \end{align*} $$

Similarly the values of $\mathbf{q’}$ and $\mathbf{r’}$ can be found which make the general rotation matrix equal to

$$ \begin{align*} \mathbf{S}(\unit{n}, k) &= \begin{bmatrix} \mathbf{p'} & \mathbf{q'} & \mathbf{r'} \end{bmatrix} \nonumber \\ & = \begin{bmatrix} 1 + (k - 1) {n_x}^2 & (k - 1)n_yn_x & (k - 1)n_zn_x \\ (k - 1)n_xn_y & 1 + (k - 1) {n_y}^2 & (k - 1)n_zn_y \\ (k - 1)n_xn_z & (k - 1)n_yn_z & 1 + (k - 1) {n_z}^2 \end{bmatrix} \end{align*} $$

References

  • Dunn, F. and Parberry, I. (2002). 3D math primer for graphics and game development. Plano, Tex.: Wordware Pub.