Clutter Engine 0.0.1
Loading...
Searching...
No Matches
rotate_vector.inl
1
2
3namespace glm
4{
5 template<typename T, qualifier Q>
6 GLM_FUNC_QUALIFIER vec<3, T, Q> slerp
7 (
8 vec<3, T, Q> const& x,
9 vec<3, T, Q> const& y,
10 T const& a
11 )
12 {
13 // get cosine of angle between vectors (-1 -> 1)
14 T CosAlpha = dot(x, y);
15 // get angle (0 -> pi)
16 T Alpha = acos(CosAlpha);
17 // get sine of angle between vectors (0 -> 1)
18 T SinAlpha = sin(Alpha);
19 // this breaks down when SinAlpha = 0, i.e. Alpha = 0 or pi
20 T t1 = sin((static_cast<T>(1) - a) * Alpha) / SinAlpha;
21 T t2 = sin(a * Alpha) / SinAlpha;
22
23 // interpolate src vectors
24 return x * t1 + y * t2;
25 }
26
27 template<typename T, qualifier Q>
28 GLM_FUNC_QUALIFIER vec<2, T, Q> rotate
29 (
30 vec<2, T, Q> const& v,
31 T const& angle
32 )
33 {
34 vec<2, T, Q> Result;
35 T const Cos(cos(angle));
36 T const Sin(sin(angle));
37
38 Result.x = v.x * Cos - v.y * Sin;
39 Result.y = v.x * Sin + v.y * Cos;
40 return Result;
41 }
42
43 template<typename T, qualifier Q>
44 GLM_FUNC_QUALIFIER vec<3, T, Q> rotate
45 (
46 vec<3, T, Q> const& v,
47 T const& angle,
48 vec<3, T, Q> const& normal
49 )
50 {
51 return mat<3, 3, T, Q>(glm::rotate(angle, normal)) * v;
52 }
53 /*
54 template<typename T, qualifier Q>
55 GLM_FUNC_QUALIFIER vec<3, T, Q> rotateGTX(
56 const vec<3, T, Q>& x,
57 T angle,
58 const vec<3, T, Q>& normal)
59 {
60 const T Cos = cos(radians(angle));
61 const T Sin = sin(radians(angle));
62 return x * Cos + ((x * normal) * (T(1) - Cos)) * normal + cross(x, normal) * Sin;
63 }
64 */
65 template<typename T, qualifier Q>
66 GLM_FUNC_QUALIFIER vec<4, T, Q> rotate
67 (
68 vec<4, T, Q> const& v,
69 T const& angle,
70 vec<3, T, Q> const& normal
71 )
72 {
73 return rotate(angle, normal) * v;
74 }
75
76 template<typename T, qualifier Q>
77 GLM_FUNC_QUALIFIER vec<3, T, Q> rotateX
78 (
79 vec<3, T, Q> const& v,
80 T const& angle
81 )
82 {
83 vec<3, T, Q> Result(v);
84 T const Cos(cos(angle));
85 T const Sin(sin(angle));
86
87 Result.y = v.y * Cos - v.z * Sin;
88 Result.z = v.y * Sin + v.z * Cos;
89 return Result;
90 }
91
92 template<typename T, qualifier Q>
93 GLM_FUNC_QUALIFIER vec<3, T, Q> rotateY
94 (
95 vec<3, T, Q> const& v,
96 T const& angle
97 )
98 {
99 vec<3, T, Q> Result = v;
100 T const Cos(cos(angle));
101 T const Sin(sin(angle));
102
103 Result.x = v.x * Cos + v.z * Sin;
104 Result.z = -v.x * Sin + v.z * Cos;
105 return Result;
106 }
107
108 template<typename T, qualifier Q>
109 GLM_FUNC_QUALIFIER vec<3, T, Q> rotateZ
110 (
111 vec<3, T, Q> const& v,
112 T const& angle
113 )
114 {
115 vec<3, T, Q> Result = v;
116 T const Cos(cos(angle));
117 T const Sin(sin(angle));
118
119 Result.x = v.x * Cos - v.y * Sin;
120 Result.y = v.x * Sin + v.y * Cos;
121 return Result;
122 }
123
124 template<typename T, qualifier Q>
125 GLM_FUNC_QUALIFIER vec<4, T, Q> rotateX
126 (
127 vec<4, T, Q> const& v,
128 T const& angle
129 )
130 {
131 vec<4, T, Q> Result = v;
132 T const Cos(cos(angle));
133 T const Sin(sin(angle));
134
135 Result.y = v.y * Cos - v.z * Sin;
136 Result.z = v.y * Sin + v.z * Cos;
137 return Result;
138 }
139
140 template<typename T, qualifier Q>
141 GLM_FUNC_QUALIFIER vec<4, T, Q> rotateY
142 (
143 vec<4, T, Q> const& v,
144 T const& angle
145 )
146 {
147 vec<4, T, Q> Result = v;
148 T const Cos(cos(angle));
149 T const Sin(sin(angle));
150
151 Result.x = v.x * Cos + v.z * Sin;
152 Result.z = -v.x * Sin + v.z * Cos;
153 return Result;
154 }
155
156 template<typename T, qualifier Q>
157 GLM_FUNC_QUALIFIER vec<4, T, Q> rotateZ
158 (
159 vec<4, T, Q> const& v,
160 T const& angle
161 )
162 {
163 vec<4, T, Q> Result = v;
164 T const Cos(cos(angle));
165 T const Sin(sin(angle));
166
167 Result.x = v.x * Cos - v.y * Sin;
168 Result.y = v.x * Sin + v.y * Cos;
169 return Result;
170 }
171
172 template<typename T, qualifier Q>
173 GLM_FUNC_QUALIFIER mat<4, 4, T, Q> orientation
174 (
175 vec<3, T, Q> const& Normal,
176 vec<3, T, Q> const& Up
177 )
178 {
179 if(all(equal(Normal, Up, epsilon<T>())))
180 return mat<4, 4, T, Q>(static_cast<T>(1));
181
182 vec<3, T, Q> RotationAxis = cross(Up, Normal);
183 T Angle = acos(dot(Normal, Up));
184
185 return rotate(Angle, RotationAxis);
186 }
187}//namespace glm
GLM_FUNC_QUALIFIER vec< 3, T, Q > cross(vec< 3, T, Q > const &x, vec< 3, T, Q > const &y)
Definition func_geometric.inl:175
GLM_FUNC_QUALIFIER vec< L, T, Q > sin(vec< L, T, Q > const &v)
Definition func_trigonometric.inl:41
GLM_FUNC_QUALIFIER vec< L, T, Q > cos(vec< L, T, Q > const &v)
Definition func_trigonometric.inl:50
GLM_FUNC_QUALIFIER vec< L, T, Q > acos(vec< L, T, Q > const &v)
Definition func_trigonometric.inl:77
GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool all(vec< L, bool, Q > const &v)
Definition func_vector_relational.inl:67
GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec< L, bool, Q > equal(vec< L, T, Q > const &x, vec< L, T, Q > const &y)
Definition func_vector_relational.inl:40
GLM_FUNC_DECL mat< 4, 4, T, Q > rotate(mat< 4, 4, T, Q > const &m, T angle, vec< 3, T, Q > const &axis)
Definition matrix_transform.inl:18
GLM_FUNC_DECL qua< T, Q > slerp(qua< T, Q > const &x, qua< T, Q > const &y, T a)
Definition quaternion_common.inl:41
GLM_FUNC_DECL T angle(qua< T, Q > const &x)
Definition quaternion_trigonometric.inl:6
GLM_FUNC_DECL GLM_CONSTEXPR genType epsilon()
Return the epsilon constant for floating point types.
Definition scalar_constants.inl:6
GLM_FUNC_DECL mat< 4, 4, T, Q > orientation(vec< 3, T, Q > const &Normal, vec< 3, T, Q > const &Up)
Definition rotate_vector.inl:174
GLM_FUNC_DECL vec< 3, T, Q > rotateY(vec< 3, T, Q > const &v, T const &angle)
Definition rotate_vector.inl:94
GLM_FUNC_DECL vec< 3, T, Q > rotateZ(vec< 3, T, Q > const &v, T const &angle)
Definition rotate_vector.inl:110
GLM_FUNC_DECL vec< 3, T, Q > rotateX(vec< 3, T, Q > const &v, T const &angle)
Definition rotate_vector.inl:78
Core features
Definition common.hpp:21
Definition qualifier.hpp:36
Definition qualifier.hpp:35