# [Bf-committers] Scale from Matrix

Chris Want cwant at ualberta.ca
Sat May 6 23:46:02 CEST 2006

```Hi Ramon,

We've tried something that I think is along the lines
of what you are suggesting:

float mat1[4][4], mat2[4][4], mat3[4][4];

EulToMat4( ob->rot, mat1);
Mat4Invert(mat2, mat1);
Mat4MulMat4(mat3, ob->obmat, mat2);

sizeX = mat3[0][0];
sizeY = mat3[1][1];
sizeZ = mat3[2][2];

The problem is that it fails when there is
parenting involved. Actually, the calculation
of size when there is parenting is really weird
since it always depends in part on the size of
the parent at the time the parenting relationship
was defined.

Chris

Ramon Carlos Ruiz wrote:
> Hi, this is very simple. For Sx first normailze
> mat[0][0],mat[0][1],mat[0][2] and create n[0][0],n[0][1],n[0][2], that
> contain the rotation only. now pick the bigger number of the first row .
> . lets said mat[0][0], then divide that element with n[0][0] and that's
> Sx or 1/Sx
>
> Un Saludo
> RCRuiz
>
> On 5/6/06, *Chris Want* <cwant at ualberta.ca <mailto:cwant at ualberta.ca>>
> wrote:
>
>
>     Hrmm, this is quite wrong, please disregard
>     (serves me right to do math on a Friday night).
>
>     Chris
>
>
>     Chris Want wrote:
>
>      > 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
>      >
>      > _______________________________________________
>      > Bf-committers mailing list
>      > Bf-committers at projects.blender.org
>     <mailto:Bf-committers at projects.blender.org>
>      > http://projects.blender.org/mailman/listinfo/bf-committers
>      >
>
>     _______________________________________________
>     Bf-committers mailing list
>     Bf-committers at projects.blender.org
>     <mailto:Bf-committers at projects.blender.org>
>     http://projects.blender.org/mailman/listinfo/bf-committers
>     <http://projects.blender.org/mailman/listinfo/bf-committers>
>
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> Bf-committers mailing list
> Bf-committers at projects.blender.org
> http://projects.blender.org/mailman/listinfo/bf-committers

```