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
69 static Quaternionx<Type> rotation_between(Vec3<Type> v0, Vec3<Type> v1);
70
72 static Quaternionx<Type> rotation_between(Vec4<Type> v0, Vec4<Type> v1);
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:
94 Mat4<Type> to_matrix() const;
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
114 Quaternionx<Type> &normalize();
115
121 Quaternionx<Type> &inverse();
122
128 Vec3<Type> rotate_vector(const Vec3<Type> &v) const;
129
130 Vec4<Type> rotate_vector(const Vec4<Type> &v) const;
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
151 Quaternionx<Type> operator *(const Mat4<Type> &matrix) const;
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
clan
Definition: clanapp.h:35
clan::Angle
Angle class.
Definition: angle.h:62
clan::Quaterniond::Quaterniond
Quaterniond(const Vec3< double > &euler, AngleUnit unit, EulerOrder order)
Definition: quaternion.h:212
clan::Key::q
clan::Quaternionf::Quaternionf
Quaternionf(float euler_x, float euler_y, float euler_z, AngleUnit unit, EulerOrder order)
Definition: quaternion.h:196
clan::Quaternionx::operator*
Quaternionx< Type > operator*(const Quaternionx< Type > &mult) const
Multiplication operator.
Definition: quaternion.h:149
clan::Quaternionx::w
Type w
The real scalar part.
Definition: quaternion.h:49
clan::Quaternionx::Quaternionx
Quaternionx(Type real, const Vec3< Type > &imag)
Definition: quaternion.h:58
clan::Quaterniond
Quaternion - Double.
Definition: quaternion.h:203
clan::Quaternionx::normalize
Quaternionx< Type > & normalize()
Normalizes this quaternion.
clan::Quaternionx::inverse
Quaternionx< Type > & inverse()
Inverse this quaternion.
clan::Quaternionx::operator==
bool operator==(const Quaternionx< Type > &other) const
Equal operator.
Definition: quaternion.h:178
clan::Quaternionx::Quaternionx
Quaternionx()
Definition: quaternion.h:56
clan::Quaternionx::slerp
static Quaternionx< Type > slerp(const Quaternionx< Type > &quaternion_initial, const Quaternionx< Type > &quaternion_final, Type slerp_time)
Spherical Quaternion Interpolation.
clan::Quaternionf::Quaternionf
Quaternionf(const Mat4< float > &rotation_matrix)
Definition: quaternion.h:192
clan::Quaternionx::normalize
static Quaternionx< Type > normalize(Quaternionx< Type > q)
Normalizes this quaternion.
Definition: quaternion.h:135
clan::Quaternionf::Quaternionf
Quaternionf()
Definition: quaternion.h:190
clan::Quaternionx::y
Type y
Definition: quaternion.h:53
clan::Quaternionf::Quaternionf
Quaternionf(float real, const Vec3< float > &imag)
Definition: quaternion.h:195
clan::Quaternionx::z
Type z
Definition: quaternion.h:54
clan::Quaternionf::Quaternionf
Quaternionf(const Angle &euler_x, const Angle &euler_y, const Angle &euler_z, EulerOrder order)
Definition: quaternion.h:198
clan::Quaternionf::Quaternionf
Quaternionf(float real, float i, float j, float k)
Definition: quaternion.h:194
clan::Key::v
clan::Quaternionx::lerp
static Quaternionx< Type > lerp(const Quaternionx< Type > &quaternion_initial, const Quaternionx< Type > &quaternion_final, Type lerp_time)
Linear Quaternion Interpolation.
clan::Quaterniond::Quaterniond
Quaterniond(double real, const Vec3< double > &imag)
Definition: quaternion.h:210
clan::Quaterniond::Quaterniond
Quaterniond(double euler_x, double euler_y, double euler_z, AngleUnit unit, EulerOrder order)
Definition: quaternion.h:211
clan::AngleUnit
AngleUnit
Angle unit.
Definition: angle.h:43
clan::Quaternionx::rotate_vector
Vec3< Type > rotate_vector(const Vec3< Type > &v) const
Rotates vector by this quaternion.
clan::Quaternionx
Quaternion.
Definition: mat4.h:70
clan::Quaternionx::multiply
static Quaternionx< Type > multiply(const Quaternionx< Type > &quaternion_1, const Quaternionx< Type > &quaternion_2)
clan::Quaternionx::operator>=
bool operator>=(const Quaternionx< Type > &other) const
Greater equal operator.
Definition: quaternion.h:175
clan::StyleValueType::angle
value is a color
clan::Quaternionx::Quaternionx
Quaternionx(Type real, Type i, Type j, Type k)
Definition: quaternion.h:57
clan::Quaternionx::x
Type x
Definition: quaternion.h:52
clan::Quaterniond::Quaterniond
Quaterniond()
Definition: quaternion.h:206
clan::Quaternionx::axis_angle
static Quaternionx< Type > axis_angle(const Angle &angle, const Vec3f &axis)
clan::Quaternionf
Quaternion - Float.
Definition: quaternion.h:187
clan::Quaternionx::rotate
Quaternionx< Type > & rotate(const Angle &angle, const Vec3f &axis)
clan::Quaternionx::inverse
static Quaternionx< Type > inverse(Quaternionx< Type > q)
Inverse this quaternion.
Definition: quaternion.h:142
clan::Vec3
3D vector
Definition: line_ray.h:48
clan::Quaternionx::to_matrix
Mat4< Type > to_matrix() const
Convert the quaternion to a rotation matrix.
clan::Quaternionf::Quaternionf
Quaternionf(const Vec3< float > &euler, AngleUnit unit, EulerOrder order)
Definition: quaternion.h:197
clan::Quaternionx::set
void set(Type euler_x, Type euler_y, Type euler_z, AngleUnit unit, EulerOrder order)
clan::Quaternionf::Quaternionf
Quaternionf(const Quaternionx< float > &copy)
Definition: quaternion.h:191
clan::Quaternionx::rotation_between
static Quaternionx< Type > rotation_between(Vec3< Type > v0, Vec3< Type > v1)
Calculates the shortest arc quaternion between two vectors.
clan::Quaternionx::Quaternionx
Quaternionx(const Quaternionx< Type > &copy)
Definition: quaternion.h:59
clan::Quaternionx::magnitude
Type magnitude() const
Get the quaternion magnitude.
clan::EulerOrder
EulerOrder
Euler angle rotation order.
Definition: angle.h:50
clan::Quaterniond::Quaterniond
Quaterniond(const Quaternionx< double > &copy)
Definition: quaternion.h:207
clan::Mat4
4D matrix
Definition: mat2.h:51
clan::Quaterniond::Quaterniond
Quaterniond(const Angle &euler_x, const Angle &euler_y, const Angle &euler_z, EulerOrder order)
Definition: quaternion.h:213
clan::Quaternionx::j
Type j
Definition: quaternion.h:53
clan::Quaternionx::operator>
bool operator>(const Quaternionx< Type > &other) const
Greater operator.
Definition: quaternion.h:163
clan::Vec4
4D vector
Definition: size.h:47
clan::Quaternionx::i
Type i
Definition: quaternion.h:52
clan::Quaterniond::Quaterniond
Quaterniond(const Mat4< double > &rotation_matrix)
Definition: quaternion.h:208
clan::Quaternionx::k
Type k
Definition: quaternion.h:54
clan::Quaterniond::Quaterniond
Quaterniond(double real, double i, double j, double k)
Definition: quaternion.h:209
clan::Quaternionx::operator!=
bool operator!=(const Quaternionx< Type > &other) const
Not equal operator.
Definition: quaternion.h:181