diff --git a/src/Base/Rotation.cpp b/src/Base/Rotation.cpp index 84d08aa33e..079f54b061 100644 --- a/src/Base/Rotation.cpp +++ b/src/Base/Rotation.cpp @@ -172,10 +172,14 @@ void Rotation::getValue(Matrix4D & matrix) const { // Taken from // - const double x = this->quat[0]; - const double y = this->quat[1]; - const double z = this->quat[2]; - const double w = this->quat[3]; + const double l = sqrt(this->quat[0] * this->quat[0] + + this->quat[1] * this->quat[1] + + this->quat[2] * this->quat[2] + + this->quat[3] * this->quat[3]); + const double x = this->quat[0] / l; + const double y = this->quat[1] / l; + const double z = this->quat[2] / l; + const double w = this->quat[3] / l; matrix[0][0] = 1.0-2.0*(y*y+z*z); matrix[0][1] = 2.0*(x*y-z*w); diff --git a/src/Mod/Test/BaseTests.py b/src/Mod/Test/BaseTests.py index b9f0a49d0a..ceabdd2576 100644 --- a/src/Mod/Test/BaseTests.py +++ b/src/Mod/Test/BaseTests.py @@ -407,6 +407,24 @@ class MatrixTestCase(unittest.TestCase): res = self.mat * mat self.assertEqual(type(res), FreeCAD.Matrix) + def testMatrixPlacementMatrix(self): + # Example taken from https://forum.freecadweb.org/viewtopic.php?f=3&t=61000 + mat = FreeCAD.Matrix(-0.470847778020266, + 0.8150598976807029, + 0.3376088628746235, + -11.25290913640202, + -0.8822144756796808, + -0.4350066260577338, + -0.180185641360483, + -2876.45492562325, + 1.955470978815492e-9, + -0.3826834326750831, + 0.923879538425552, + 941.3822018176414) + plm = FreeCAD.Placement(mat) + mat = plm.toMatrix() + self.assertEqual(mat.hasScale(), FreeCAD.ScaleType.NoScaling) + def testAnything(self): with self.assertRaises(NotImplementedError): self.mat * "string"