[Bf-committers] Scale from Matrix

Chris Want cwant at ualberta.ca
Sat May 6 08:13:17 CEST 2006

Campbell Barton wrote:
> Hey All,
> have a problem, sound simple but cant find a soltion.
>
> I need to get the scale value of a matrix.
> arithb.c's  Mat4ToSize  works but the returned scale is never negative,
> so at the moment, I cant tell if a the model is flipped by it matrix.
>
> Obviously its in blender somewhere, bacause the SizeX: value can be
> negative.
>
> Anyone know how to do this?
> - Cam
>

Hi Campbell,

My linear algebra is a bit shaky, but I think it goes something
like this:

Suppose you have mat (the one you are feeding to Mat4ToSize),
and the positive output from Mat4ToSize, sx, sy, sz.

The real SizeX, SizeY and SizeZ should be eigenvalues of mat.
The eigenvectors should be the columns of mat (so first column of
mat cooresponds to eigenvalue SizeX, etc). Call these column vectors
v1, v2, v3.

So, what I believe you should do is test that mat*v1 == sx*v1
(both sides are column vectors, left side is matrix multiplication,
right side is scalar multiplication).

If this is true (within some error tolerance), then sx is indeed
the correct eigenvalue, so you can set SizeX = sx,
else SizeX = -sx (might be prudent to test that mat*v1 == -sx*v1).

Similarly, test mat*v2 = sy*v2 and mat*v3 = sz*v3.

Anyways, I hope my recollection isn't too hazy, and that the description
isn't too incoherent.

Regards,
Chris