diff --git a/src/mathematics/Quaternion.cpp b/src/mathematics/Quaternion.cpp index d1451a3d..a8918f93 100644 --- a/src/mathematics/Quaternion.cpp +++ b/src/mathematics/Quaternion.cpp @@ -106,7 +106,7 @@ Quaternion::Quaternion(const Matrix3x3& matrix) { // Compute the quaternion x = decimal(0.5) * r; y = (matrix[0][1] + matrix[1][0]) * s; - z = (matrix[2][0] - matrix[0][2]) * s; + z = (matrix[2][0] + matrix[0][2]) * s; w = (matrix[2][1] - matrix[1][2]) * s; } } diff --git a/test/tests/mathematics/TestQuaternion.h b/test/tests/mathematics/TestQuaternion.h index 3a25cba9..042aa577 100644 --- a/test/tests/mathematics/TestQuaternion.h +++ b/test/tests/mathematics/TestQuaternion.h @@ -90,6 +90,21 @@ class TestQuaternion : public Test { rp3d_test(approxEqual(quaternion4.z, mQuaternion1.z)); rp3d_test(approxEqual(quaternion4.w, mQuaternion1.w)); + Matrix3x3 original(0.001743,-0.968608,0.248589,-0.614229,-0.197205,-0.764090,0.789126,-0.151359,-0.595290); + Matrix3x3 converted = Quaternion(original).getMatrix(); + rp3d_test(approxEqual(original[0][0], converted[0][0], 0.0001)); + rp3d_test(approxEqual(original[0][1], converted[0][1], 0.0001)); + rp3d_test(approxEqual(original[0][2], converted[0][2], 0.0001)); + rp3d_test(approxEqual(original[1][0], converted[1][0], 0.0001)); + rp3d_test(approxEqual(original[1][1], converted[1][1], 0.0001)); + rp3d_test(approxEqual(original[1][2], converted[1][2], 0.0001)); + rp3d_test(approxEqual(original[2][0], converted[2][0], 0.0001)); + rp3d_test(approxEqual(original[2][1], converted[2][1], 0.0001)); + rp3d_test(approxEqual(original[2][2], converted[2][2], 0.0001)); + + std::cout << original.to_string() << std::endl; + std::cout << converted.to_string() << std::endl; + // Test conversion from Euler angles to quaternion const decimal PI_OVER_2 = PI * decimal(0.5);