quaternion.h
1 /*
2 ** ClanLib SDK
3 ** Copyright (c) 1997-2015 The ClanLib Team
4 **
5 ** This software is provided 'as-is', without any express or implied
6 ** warranty. In no event will the authors be held liable for any damages
7 ** arising from the use of this software.
8 **
9 ** Permission is granted to anyone to use this software for any purpose,
10 ** including commercial applications, and to alter it and redistribute it
11 ** freely, subject to the following restrictions:
12 **
13 ** 1. The origin of this software must not be misrepresented; you must not
14 ** claim that you wrote the original software. If you use this software
15 ** in a product, an acknowledgment in the product documentation would be
16 ** appreciated but is not required.
17 ** 2. Altered source versions must be plainly marked as such, and must not be
18 ** misrepresented as being the original software.
19 ** 3. This notice may not be removed or altered from any source distribution.
20 **
21 ** Note: Some of the libraries ClanLib may link to may have additional
22 ** requirements or restrictions.
23 **
24 ** File Author(s):
25 **
26 ** Mark Page
27 */
28 
29 
30 #pragma once
31 
32 
33 #include "vec3.h"
34 #include "angle.h"
35 
36 namespace clan
37 {
40 
44 template<typename Type>
45 class Quaternionx
46 {
47 public:
49  Type w;
50 
52  union { Type i; Type x; };
53  union { Type j; Type y; };
54  union { Type k; Type z; };
55 
56  Quaternionx() : w(1), i(0), j(0), k(0) { }
57  explicit Quaternionx(Type real, Type i, Type j, Type k) : w(real), i(i), j(j), k(k) { }
58  explicit Quaternionx(Type real, const Vec3<Type> &imag) : w(real), i(imag.x), j(imag.y), k(imag.z) { }
59  Quaternionx(const Quaternionx<Type> &copy) : w(copy.w), i(copy.i), j(copy.j), k(copy.k) { }
60  explicit Quaternionx(Type euler_x, Type euler_y, Type euler_z, AngleUnit unit, EulerOrder order);
61  explicit Quaternionx(const Vec3<Type> &euler, AngleUnit unit, EulerOrder order);
62  explicit Quaternionx(const Angle &euler_x, const Angle &euler_y, const Angle &euler_z, EulerOrder order);
63  explicit Quaternionx(const Mat4<Type> &rotation_matrix);
64 
65  static Quaternionx<Type> axis_angle(const Angle &angle, const Vec3f &axis);
66  static Quaternionx<Type> multiply(const Quaternionx<Type> &quaternion_1, const Quaternionx<Type> &quaternion_2);
67 
70 
73 
79  static Quaternionx<Type> lerp(const Quaternionx<Type> &quaternion_initial, const Quaternionx<Type> &quaternion_final, Type lerp_time);
80 
86  static Quaternionx<Type> slerp(const Quaternionx<Type> &quaternion_initial, const Quaternionx<Type> &quaternion_final, Type slerp_time);
87 
90 public:
95 
97  Type magnitude() const;
98 
102 public:
103  void set(Type euler_x, Type euler_y, Type euler_z, AngleUnit unit, EulerOrder order);
104  void set(const Vec3<Type> &euler, AngleUnit unit, EulerOrder order);
105  void set(const Angle &euler_x, const Angle &euler_y, const Angle &euler_z, EulerOrder order);
106 
107  Quaternionx<Type> &rotate(const Angle &angle, const Vec3f &axis);
108 
109  Quaternionx<Type> &rotate(const Angle &euler_x, const Angle &euler_y, const Angle &euler_z, EulerOrder order);
110 
115 
122 
129 
131 
135  static Quaternionx<Type> normalize(Quaternionx<Type> q) { return q.normalize(); }
136 
142  static Quaternionx<Type> inverse(Quaternionx<Type> q) { return q.inverse(); }
143 
147 public:
149  Quaternionx<Type> operator *(const Quaternionx<Type> &mult) const { return Quaternionx<Type>::multiply(*this, mult); }
150 
152 
154  bool operator<(const Quaternionx<Type> &other) const
155  {
156  if (x != other.x) return x < other.x;
157  else if (y != other.y) return y < other.y;
158  else if (z != other.z) return z < other.z;
159  else return w < other.w;
160  }
161 
163  bool operator>(const Quaternionx<Type> &other) const
164  {
165  if (x != other.x) return x > other.x;
166  else if (y != other.y) return y > other.y;
167  else if (z != other.z) return z > other.z;
168  else return w > other.w;
169  }
170 
172  bool operator<=(const Quaternionx<Type> &other) const { return *this < other || *this == other; }
173 
175  bool operator>=(const Quaternionx<Type> &other) const { return *this > other || *this == other; }
176 
178  bool operator==(const Quaternionx<Type> &other) const { return x == other.x && y == other.y && z == other.z && w == other.w; }
179 
181  bool operator!=(const Quaternionx<Type> &other) const { return x != other.x || y != other.y || z != other.z || w == other.w; }
182 
184 };
185 
187 class Quaternionf : public Quaternionx<float>
188 {
189 public:
190  Quaternionf() : Quaternionx<float>() { }
191  Quaternionf(const Quaternionx<float> &copy) : Quaternionx<float>(copy) { }
192  explicit Quaternionf(const Mat4<float> &rotation_matrix) : Quaternionx<float>(rotation_matrix) { };
193 
194  explicit Quaternionf(float real, float i, float j, float k) : Quaternionx<float>(real, i, j, k) { }
195  explicit Quaternionf(float real, const Vec3<float> &imag) : Quaternionx<float>(real, imag) { }
196  explicit Quaternionf(float euler_x, float euler_y, float euler_z, AngleUnit unit, EulerOrder order) : Quaternionx<float>(euler_x, euler_y, euler_z, unit, order) { }
197  explicit Quaternionf(const Vec3<float> &euler, AngleUnit unit, EulerOrder order) : Quaternionx<float>(euler, unit, order) { }
198  explicit Quaternionf(const Angle &euler_x, const Angle &euler_y, const Angle &euler_z, EulerOrder order) : Quaternionx<float>(euler_x, euler_y, euler_z, order) { }
199 
200 };
201 
203 class Quaterniond : public Quaternionx<double>
204 {
205 public:
206  Quaterniond() : Quaternionx<double>() { }
207  Quaterniond(const Quaternionx<double> &copy) : Quaternionx<double>(copy) { }
208  explicit Quaterniond(const Mat4<double> &rotation_matrix) : Quaternionx<double>(rotation_matrix) { }
209  explicit Quaterniond(double real, double i, double j, double k) : Quaternionx<double>(real, i, j, k) { }
210  explicit Quaterniond(double real, const Vec3<double> &imag) : Quaternionx<double>(real, imag) { }
211  explicit Quaterniond(double euler_x, double euler_y, double euler_z, AngleUnit unit, EulerOrder order) : Quaternionx<double>(euler_x, euler_y, euler_z, unit, order) { }
212  explicit Quaterniond(const Vec3<double> &euler, AngleUnit unit, EulerOrder order) : Quaternionx<double>(euler, unit, order) { }
213  explicit Quaterniond(const Angle &euler_x, const Angle &euler_y, const Angle &euler_z, EulerOrder order) : Quaternionx<double>(euler_x, euler_y, euler_z, order) { }
214 };
215 
216 }
217 
Quaterniond(const Quaternionx< double > &copy)
Definition: quaternion.h:207
Type i
Definition: quaternion.h:52
Quaternionx()
Definition: quaternion.h:56
Quaternionf(float real, float i, float j, float k)
Definition: quaternion.h:194
Quaternion - Float.
Definition: quaternion.h:188
static Quaternionx< Type > rotation_between(Vec3< Type > v0, Vec3< Type > v1)
Calculates the shortest arc quaternion between two vectors.
void set(const Vec3< Type > &euler, AngleUnit unit, EulerOrder order)
bool operator>(const Quaternionx< Type > &other) const
Greater operator.
Definition: quaternion.h:163
Type j
Definition: quaternion.h:53
static Quaternionx< Type > normalize(Quaternionx< Type > q)
Normalizes this quaternion.
Definition: quaternion.h:135
Quaternion.
Definition: mat4.h:70
Type z
Definition: quaternion.h:54
static Quaternionx< Type > slerp(const Quaternionx< Type > &quaternion_initial, const Quaternionx< Type > &quaternion_final, Type slerp_time)
Spherical Quaternion Interpolation.
static Quaternionx< Type > rotation_between(Vec4< Type > v0, Vec4< Type > v1)
Calculates the shortest arc quaternion between two vectors.
Quaternionx< Type > operator*(const Quaternionx< Type > &mult) const
Multiplication operator.
Definition: quaternion.h:149
Quaternionf()
Definition: quaternion.h:190
Type k
Definition: quaternion.h:54
static Quaternionx< Type > inverse(Quaternionx< Type > q)
Inverse this quaternion.
Definition: quaternion.h:142
Type y
Definition: quaternion.h:53
Mat4< Type > to_matrix() const
Convert the quaternion to a rotation matrix.
bool operator<=(const Quaternionx< Type > &other) const
Less equal operator.
Definition: quaternion.h:172
Quaterniond(const Vec3< double > &euler, AngleUnit unit, EulerOrder order)
Definition: quaternion.h:212
Quaternionf(const Mat4< float > &rotation_matrix)
Definition: quaternion.h:192
Type w
The real scalar part.
Definition: quaternion.h:49
Angle class.
Definition: angle.h:63
Quaternionx< Type > & rotate(const Angle &angle, const Vec3f &axis)
EulerOrder
Euler angle rotation order.
Definition: angle.h:51
Type x
Definition: quaternion.h:52
Quaternion - Double.
Definition: quaternion.h:204
Quaternionx< Type > & normalize()
Normalizes this quaternion.
void set(const Angle &euler_x, const Angle &euler_y, const Angle &euler_z, EulerOrder order)
Quaterniond(const Angle &euler_x, const Angle &euler_y, const Angle &euler_z, EulerOrder order)
Definition: quaternion.h:213
Quaterniond()
Definition: quaternion.h:206
static Quaternionx< Type > multiply(const Quaternionx< Type > &quaternion_1, const Quaternionx< Type > &quaternion_2)
4D matrix
Definition: mat2.h:51
Quaternionx< Type > & rotate(const Angle &euler_x, const Angle &euler_y, const Angle &euler_z, EulerOrder order)
static Quaternionx< Type > lerp(const Quaternionx< Type > &quaternion_initial, const Quaternionx< Type > &quaternion_final, Type lerp_time)
Linear Quaternion Interpolation.
AngleUnit
Angle unit.
Definition: angle.h:44
Quaterniond(double real, const Vec3< double > &imag)
Definition: quaternion.h:210
Vec3< Type > rotate_vector(const Vec3< Type > &v) const
Rotates vector by this quaternion.
static Quaternionx< Type > axis_angle(const Angle &angle, const Vec3f &axis)
4D vector
Definition: size.h:47
Quaternionf(const Vec3< float > &euler, AngleUnit unit, EulerOrder order)
Definition: quaternion.h:197
Quaternionf(const Angle &euler_x, const Angle &euler_y, const Angle &euler_z, EulerOrder order)
Definition: quaternion.h:198
Quaterniond(double real, double i, double j, double k)
Definition: quaternion.h:209
Definition: clanapp.h:36
bool operator<(const Quaternionx< Type > &other) const
Less operator.
Definition: quaternion.h:154
Quaternionf(const Quaternionx< float > &copy)
Definition: quaternion.h:191
Quaterniond(double euler_x, double euler_y, double euler_z, AngleUnit unit, EulerOrder order)
Definition: quaternion.h:211
Quaternionx(const Angle &euler_x, const Angle &euler_y, const Angle &euler_z, EulerOrder order)
bool operator!=(const Quaternionx< Type > &other) const
Not equal operator.
Definition: quaternion.h:181
Quaternionf(float real, const Vec3< float > &imag)
Definition: quaternion.h:195
bool operator>=(const Quaternionx< Type > &other) const
Greater equal operator.
Definition: quaternion.h:175
Type magnitude() const
Get the quaternion magnitude.
Quaternionx(Type real, const Vec3< Type > &imag)
Definition: quaternion.h:58
Quaternionx< Type > & inverse()
Inverse this quaternion.
Vec4< Type > rotate_vector(const Vec4< Type > &v) const
3D vector
Definition: line_ray.h:48
Quaternionf(float euler_x, float euler_y, float euler_z, AngleUnit unit, EulerOrder order)
Definition: quaternion.h:196
Quaternionx(const Vec3< Type > &euler, AngleUnit unit, EulerOrder order)
bool operator==(const Quaternionx< Type > &other) const
Equal operator.
Definition: quaternion.h:178
Quaternionx(const Quaternionx< Type > &copy)
Definition: quaternion.h:59
Quaternionx(const Mat4< Type > &rotation_matrix)
Quaternionx(Type real, Type i, Type j, Type k)
Definition: quaternion.h:57
Quaternionx(Type euler_x, Type euler_y, Type euler_z, AngleUnit unit, EulerOrder order)
void set(Type euler_x, Type euler_y, Type euler_z, AngleUnit unit, EulerOrder order)
Quaterniond(const Mat4< double > &rotation_matrix)
Definition: quaternion.h:208