1/// @ref gtx_rotate_vector 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 188