views:

927

answers:

2

I wonder if it is possible (and if it is then how) to re-present an arbitrary M3 matrix transformation as a sequence of simpler transformations (such as translate, scale, skew, rotate)

In other words: how to calculate MTranslate, MScale, MRotate, MSkew matrices from the MComplex so that the following equation would be true:

MComplex = MTranslate * MScale * MRotate * MSkew (or in an other order)

+1  A: 

Yes, but the solution will not be unique. Also you should rather put translation at the end (the order of the rest doesn't matter)

For any given square matrix A there exists infinitely many matrices B and C so that A = B*C. Choose any invertible matrix B (which means that B^-1 exists or det(B) != 0) and now C = B^-1*A.

So for your solution first decompose MC into MT and MS*MR*MSk*I, choosing MT to be some invertible transposition matrix. Then decompose the rest into MS and MR*MSk*I so that MS is arbitrary scaling matrix. And so on...

Now if at the end of the fun I is an identity matrix (with 1 on diagonal, 0 elsewhere) you're good. If it is not, start over, but choose different matrices ;-)

In fact, using the method above symbolically you can create set of equations that will yield you a parametrized formulas for all of these matrices.

How useful these decompositions would be for you, well - that's another story.

If you type this into Mathematica or Maxima they'll compute this for you in no time.

Marcin
You have a good point, except that these matrices have additional bonds (translation is identity matrix with rightmost column containing translation vector, etc.). As far as I can imagine, these four transformations — granted that order is fixed — should yield unambiguous result.
samuil
+3  A: 

Singular Value Decomposition (see also this blog and this PDF). It turns an arbitrary matrix into a composition of 3 matrices: orthogonal + diagonal + orthogonal. The orthogonal matrices are rotation matrices; the diagonal matrix represents skewing along the primary axes = scaling.

The translation throws a monkey wrench into the game, but what you should do is take out the translation part of the matrix so you have a 3x3 matrix, run SVD on that to give you the rotation+skewing, then add the translation part back in. That way you'll have a rotation + scale + rotation + translate composition of 4 matrices. It's probably possible to do this in 3 matrices (rotation + scaling along some set of axes + translation) but I'm not sure exactly how... maybe a QR decomposition (Q = orthogonal = rotation, but I'm not sure if the R is skew-only or has a rotational part.)

Jason S