diff --git a/vcg/math/similarity.h b/vcg/math/similarity.h index f4572673..212148ff 100644 --- a/vcg/math/similarity.h +++ b/vcg/math/similarity.h @@ -203,19 +203,19 @@ template void Similarity::FromMatri //Computes a t*s*r decomposition S det = m.Determinant(); assert(det > 0); - sca = (S)pow(det, 1/3.0); + sca = (S)pow((S)det, (S)(1/3.0)); Matrix44 t = m*Matrix44().SetScale(1/sca, 1/sca, 1/sca); + tra[0] = t.ElementAt(0, 3);t[0][3] = 0.0; + tra[1] = t.ElementAt(1, 3);t[1][3] = 0.0; + tra[2] = t.ElementAt(2, 3);t[2][3] = 0.0; rot.FromMatrix(t); - tra[0] = t.ElementAt(0, 3); - tra[1] = t.ElementAt(1, 3); - tra[2] = t.ElementAt(2, 3); -//Compute a s*r*t decomposition - Quaternion irot = rot; - irot.Invert(); - tra = irot.Rotate(tra); - tra /= sca; + + Invert(t); + tra = t * tra; + tra/= sca; } + template Similarity &Invert(Similarity &a) { a.rot.Invert(); a.sca = 1/a.sca; @@ -238,7 +238,9 @@ template Similarity Interpolate(con } template Point3 operator*(const Similarity &m, const Point3 &p) { - Point3 r = m.rot.Rotate(p); + Matrix44 t; + m.rot.ToMatrix(t); + Point3 r = t*p; r *= m.sca; r += m.tra; return r;