diff options
Diffstat (limited to 'core')
-rw-r--r-- | core/math/matrix3.cpp | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/core/math/matrix3.cpp b/core/math/matrix3.cpp index b59fecc196..b64f34d977 100644 --- a/core/math/matrix3.cpp +++ b/core/math/matrix3.cpp @@ -30,7 +30,7 @@ #include "matrix3.h" #include "math_funcs.h" #include "os/copymem.h" - +#include "print_string.h" #define cofac(row1, col1, row2, col2) \ (elements[row1][col1] * elements[row2][col2] - elements[row1][col2] * elements[row2][col1]) @@ -364,8 +364,16 @@ Vector3 Basis::get_euler() const { euler.y = Math::asin(elements[0][2]); if (euler.y < Math_PI * 0.5) { if (euler.y > -Math_PI * 0.5) { - euler.x = Math::atan2(-elements[1][2], elements[2][2]); - euler.z = Math::atan2(-elements[0][1], elements[0][0]); + //if rotation is Y-only, return a proper -pi,pi range like in x or z for the same case. + if (elements[1][0] == 0.0 && elements[0][1] == 0.0 && elements[0][0] < 0.0) { + if (euler.y > 0.0) + euler.y = Math_PI - euler.y; + else + euler.y = -(Math_PI + euler.y); + } else { + euler.x = Math::atan2(-elements[1][2], elements[2][2]); + euler.z = Math::atan2(-elements[0][1], elements[0][0]); + } } else { real_t r = Math::atan2(elements[1][0], elements[1][1]); |