diff --git a/glm/ext/quaternion_trigonometric.inl b/glm/ext/quaternion_trigonometric.inl index 06b7c4c3..896449aa 100644 --- a/glm/ext/quaternion_trigonometric.inl +++ b/glm/ext/quaternion_trigonometric.inl @@ -7,7 +7,10 @@ namespace glm { if (abs(x.w) > cos_one_over_two()) { - return asin(sqrt(x.x * x.x + x.y * x.y + x.z * x.z)) * static_cast(2); + T const a = asin(sqrt(x.x * x.x + x.y * x.y + x.z * x.z)) * static_cast(2); + if(x.w < static_cast(0)) + return pi() * static_cast(2) - a; + return a; } return acos(x.w) * static_cast(2); diff --git a/test/ext/ext_quaternion_trigonometric.cpp b/test/ext/ext_quaternion_trigonometric.cpp index 1c1d6084..d2371252 100644 --- a/test/ext/ext_quaternion_trigonometric.cpp +++ b/test/ext/ext_quaternion_trigonometric.cpp @@ -21,6 +21,12 @@ static int test_angle() Error += glm::equal(A, 90.0f, Epsilon) ? 0 : 1; } + { + glm::quat const Q = glm::angleAxis(glm::two_pi() - 1.0f, glm::vec3(1, 0, 0)); + float const A = glm::angle(Q); + Error += glm::equal(A, 1.0f, Epsilon) ? 1 : 0; + } + return Error; }