1 KB、37行 生 Blame 履歴
1#include "scalar_constants.hpp"
2
3namespace glm
4{
5 template<typename T, qualifier Q>
6 GLM_FUNC_QUALIFIER T angle(qua<T, Q> const& x)
7 {
8 if (abs(x.w) > cos_one_over_two<T>())
9 {
10 T const a = asin(sqrt(x.x * x.x + x.y * x.y + x.z * x.z)) * static_cast<T>(2);
11 if(x.w < static_cast<T>(0))
12 return pi<T>() * static_cast<T>(2) - a;
13 return a;
14 }
15
16 return acos(x.w) * static_cast<T>(2);
17 }
18
19 template<typename T, qualifier Q>
20 GLM_FUNC_QUALIFIER vec<3, T, Q> axis(qua<T, Q> const& x)
21 {
22 T const tmp1 = static_cast<T>(1) - x.w * x.w;
23 if(tmp1 <= static_cast<T>(0))
24 return vec<3, T, Q>(0, 0, 1);
25 T const tmp2 = static_cast<T>(1) / sqrt(tmp1);
26 return vec<3, T, Q>(x.x * tmp2, x.y * tmp2, x.z * tmp2);
27 }
28
29 template<typename T, qualifier Q>
30 GLM_FUNC_QUALIFIER qua<T, Q> angleAxis(T const& angle, vec<3, T, Q> const& v)
31 {
32 T const a(angle);
33 T const s = glm::sin(a * static_cast<T>(0.5));
34
35 return qua<T, Q>(glm::cos(a * static_cast<T>(0.5)), v * s);
36 }
37}//namespace glm