# How to decompose linear transformation into "lerp-able" products of rotation and scaling transforms?

Given two linear transforms in 3D as a matrices $$A_0,A_1 \in \mathbb{R}^{3 \times 3}$$. I can lerp between them for any "time", $$t \in [0,1]$$ using an expression such as$$^1$$ $$A_t = \exp\left( (1-t) \log(A_0) + t \log(A_1)\right).$$ This gives pleasing interpolations, such as in this example where $$A_0 = I$$ and $$A_1 = \begin{bmatrix}1&-1&0\\0 & 1 & 0 \\ 0 & 0 & 1\end{bmatrix}$$:

Now, consider that I'm not allowed to store or interpolate linear transformations directly. I must decompose each transform into a product of rotations and diagonal matrices (a.k.a., non-uniform scaling transforms). I.e., $$A_0 = R_0^1 S_0^1 \dots R_0^n S_0^n$$ and $$A_1 = R_1^1 S_1^1 \dots R_1^n S_1^n$$.

Interpolations will be conducted by slerping rotations and linearly interpolating diagonal matrix entries.

How can I emulate the linear interpolation above under these conditions?

As an example of a poor solution, consider decomposing the input transformations using singular value decomposition:

$$A = U S V^\top \\ A = \underbrace{\det{(U)}\ U}_{R^1} \ \underbrace{\det{(U)} \ S \ \det{(V)}}_{S^1} \ \underbrace{\det{(V)}\ V^\top}_{R^2} \\ A = R^1 S^1 R^2$$ By construction, $$R^1,R^2 \in SO(3)$$ and $$S^1$$ is diagonal.

Slerping and lerping these transforms for the problem above via:

$$A_t = \text{slerp}\left(R^1_0,R^1_1,t\right)\ \left((1-t) S^1_0 + t S^1_1\right)\ \text{slerp}\left(R^2_0,R^2_1,t\right)$$

produces an interpolation with the correct end-point values but wild behavior in between:

Is it fundamentally impossible to get a better interpolation? If not, would using more than two auxiliary rotations per transform help tame this interpolation?

Typically, I have a sequence of transforms $$A_0,A_1,A_2, \dots$$. So, another phrasing would be, given a decomposition for $$A_0$$ (i.e., all $$R^i_0$$ and $$S^i_0$$ are given) what values for the decomposition of $$A_1$$ would create the least-motion/least-work interpolation?

• I edited your post because it was difficult to parse that the $|$'s were brackets for $|\cdot|$ expressions. I presume $|U|$ refers to the determinant of $U$ in this context (personally, I prefer $\det(U)$); perhaps this deserves an explicit statement. Commented Aug 29, 2022 at 12:57

Another method to interpolate from $$I$$ to a matrix $$A$$ with $$\det(A) > 0$$: let $$A = USV^T$$ be an SVD. We can write $$A = \underbrace{UV^T}_{R_1}\ \ \underbrace{VSV^T}_B,$$ noting that $$R_1$$ is guaranteed to be a rotation when $$\det(A) > 0$$. Notably, $$B = VSV^T$$ is the spectral decomposition of a positive definite matrix. If $$V$$ is a rotation, then we're done. Otherwise, as below, we can take $$B = \underbrace{VD_\epsilon}_{R_2} \ S\ \underbrace{D_{\epsilon} V^T}_{R_3}.$$ I believe that "slerping" preserves the property that $$R_2$$ and $$R_3$$ are inverses, which I suspect means that the choice of $$D_\epsilon$$ used here has no effect on the overall transformation.

An improvement to the approach below: denote $$D_{\epsilon}^x = \pmatrix{\epsilon &0&0\\0&1&0\\0&0&1},\quad D_{\epsilon}^{y} = \pmatrix{1&0&0\\0&\epsilon&0\\0&0&1}, \quad D_{\epsilon}^{z} = \pmatrix{1&0&0\\0&1&0\\0&0&\epsilon}.$$ For each choice of $$D_{\epsilon} \in \{D_{\epsilon}^x,D_\epsilon^y,D_\epsilon^z,\epsilon I\}$$, the product $$A = U S V^T = \underbrace{U D_{|U|}}_{R^1} \underbrace{D_{|U|}SD_{|V|}}_{S^1} \underbrace{D_{|V|}V^T}_{R^2}$$ is a suitable decomposition. I suspect that the "wildness" of the rotation is determined by the angle by which $$R^1$$ and $$R^2$$ rotate; a lower angle means a more parsimonious interpolation.

With that in mind, I suspect that a good heuristic for the best candidate $$D_{\epsilon} \in \{D_{\epsilon}^x,D_\epsilon^y,D_\epsilon^z,\epsilon I\}$$ is to choose the candidate for which the sum of the angle-cosines is maximized, i.e. the candidate for which $$\operatorname{tr}(UD_{|U|}) + \operatorname{tr}(D_{|V|}V^T)$$ is maximized.

I suspect that using the SVD is a reasonable approach here, but that the particular way that you have chosen to make $$U$$ and $$V$$ into rotation matrices (i.e. by multiplying by their determinants) has led to this issue. I suggest the following alternative.

Define $$D_{\epsilon} = \pmatrix{1&0&0\\0&1&0\\0&0&\epsilon}.$$ Decompose $$A$$ as the product $$A = U S V^T = \underbrace{U D_{|U|}}_{R^1} \underbrace{D_{|U|}SD_{|V|}}_{S^1} \underbrace{D_{|V|}V^T}_{R^2}.$$

• This worked well for my shear tests but produces a wild interpolation when $A_0 = I$ and $A_1 = \begin{bmatrix} 0 & -1 & 0 \\ 1 & 0 & 0 \\ 0 & 0 & 1 \end{bmatrix}$. Commented Aug 29, 2022 at 13:28
• That's surprising. What SVD did you get for $A_1$? Since $A_1$ is a rotation and $A_1 = A_1 \cdot I\cdot I$ is an SVD, this should just come down to slerping a rotaiton Commented Aug 29, 2022 at 13:31
• I get $A_1 = \begin{bmatrix} 0 & -1 & 0 \\ -1 & 0 & 0 \\ 0 & 0 & 1 \end{bmatrix} \ I \ \begin{bmatrix} -1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix}^\top$ Commented Aug 29, 2022 at 13:36
• You could get two alternatives by switching $\epsilon$ to a different diagonal entry. For this particular case, replacing $D_{\epsilon}$ with $$\pmatrix{\epsilon & 0 & 0\\0 & 1 & 0\\0 & 0 & 1}$$ should give us the "better" interpolation. So you could extend this approach to get 3 candidate interpolations, but there's still the question of how to choose the best of the 3 Commented Aug 29, 2022 at 13:40
• I think $V$ contains the information of which to use, but I'm not quite there yet. We know that the best fit rotation to $A$ is $U D_{|UV^\top|} V^\top$... I'm trying to force this to be $R^1$ and then handle the shear after. Commented Aug 29, 2022 at 13:44