21 #ifndef KJB_QUATERNION_H
22 #define KJB_QUATERNION_H
29 #ifdef KJB_HAVE_BST_SERIAL
30 #include <boost/serialization/access.hpp>
42 #ifdef KJB_HAVE_BST_SERIAL
43 friend class boost::serialization::access;
106 Quaternion(
double x,
double y,
double z,
double w);
120 void swap(Self& other);
126 return _q.x == 0 && _q.y == 0 && _q.z == 0 && _q.w == 1.0;
178 double norm(
unsigned int l = 2)
const;
184 return _q.w*_q.w + _q.x*_q.x + _q.y*_q.y + _q.z*_q.z;
246 const static float NORMALIZED_TOLERANCE;
247 static float EPSILON;
248 static float GIMBAL_LOCK_EPSILON;
251 mutable Matrix _rotation_matrix;
252 mutable bool _rotation_matrix_dirty;
255 mutable double _angle;
256 mutable bool _axis_angle_dirty;
259 mutable bool _eulers_dirty;
279 void _update_rotation_matrix()
const;
280 void _update_axis_angle()
const;
281 void _update_euler_angles()
const;
283 void _update_from_rotation_matrix();
284 void _update_from_axis_angle();
285 void _update_from_euler_angles();
292 void _fix_angles()
const;
293 void _fix_axis_angle()
const;
315 void _update_euler_order();
320 #ifdef KJB_HAVE_BST_SERIAL
321 template <
class Archive>
322 void serialize(Archive& ar,
const unsigned int )
331 if(Archive::is_loading::value ==
true)
332 _update_euler_order();
340 inline void Quaternion::_dirty_all()
342 _rotation_matrix_dirty =
true;
343 _axis_angle_dirty =
true;
344 _eulers_dirty =
true;
351 inline int Quaternion::_eul_ord(Euler_axis
i, Euler_parity p, Euler_repeat
r, Euler_frame f)
353 return (((((((i)<<1)+(p))<<1)+(r))<<1)+(f));
357 inline void Quaternion::_eul_get_ord(
int ord, Euler_axis &i, Euler_axis &j, Euler_axis &
k, Euler_axis &h, Euler_parity &n, Euler_repeat &s, Euler_frame &f)
401 return result /=
norm(result);
405 Quaternion
slerp(
const Quaternion& q1,
const Quaternion& q2,
double t);
408 Quaternion
slerp2(
const Quaternion& q1,
const Quaternion& q2,
double t);
413 Quaternion
nlerp(
const Quaternion& q1,
const Quaternion& q2,
double t);
Definition: g_quaternion.h:71
Quaternion conj() const
Definition: g_quaternion.cpp:808
friend Quaternion slerp(const Quaternion &q1, const Quaternion &q2, double t)
Definition: g_quaternion.cpp:1366
bool operator!=(const Quaternion &) const
Definition: g_quaternion.cpp:802
Vector rotate(const Vector &v) const
Definition: g_quaternion.cpp:565
friend std::ostream & operator<<(std::ostream &out, const Quaternion &q)
Definition for the Matrix class, a thin wrapper on the KJB Matrix struct and its related functionalit...
Quaternion difference(const Quaternion &q1, const Quaternion &q2)
Definition: g_quaternion.h:398
Quaternion & set_euler_psi(double psi)
Definition: g_quaternion.cpp:509
bool is_identity() const
Definition: g_quaternion.h:124
Vector_d< 3 > Vector3
Definition: g_quaternion.h:37
Euler_parity
Definition: g_quaternion.h:88
Definition: g_quaternion.h:69
static const Euler_axis EulNext[4]
Definition: g_quaternion.h:311
Quaternion & set_rotation_matrix(const Matrix &)
Definition: g_quaternion.cpp:326
Definition: g_quaternion.h:63
Definition: g_quaternion.h:68
Definition: g_quaternion.h:90
friend Quaternion slerp2(const Quaternion &q1, const Quaternion &q2, double t)
Definition: g_quaternion.cpp:1402
Definition: g_quaternion.h:100
Definition: g_quaternion.h:79
Quaternion nlerp(const Quaternion &q1, const Quaternion &q2, double t)
Definition: g_quaternion.cpp:1442
theta
Definition: APPgetLargeConnectedEdges.m:108
Definition: g_quaternion.h:78
Definition: g_quaternion.h:73
Quaternion operator/(const Quaternion &) const
Definition: g_quaternion.cpp:871
void swap(Perspective_camera &cam1, Perspective_camera &cam2)
Swap two cameras.
Definition: perspective_camera.h:599
Definition: g_quaternion.h:75
for k
Definition: APPgetLargeConnectedEdges.m:61
Euler_frame
Definition: g_quaternion.h:98
static void set_default_euler_mode(Euler_mode m)
Definition: g_quaternion.cpp:534
r
Definition: APPgetLargeConnectedEdges.m:127
const Matrix & get_rotation_matrix() const
Definition: g_quaternion.cpp:282
Definition: g_quaternion.h:69
double magnitude_squared() const
Definition: g_quaternion.h:182
This class implements vectors, in the linear-algebra sense, with real-valued elements.
Definition: m_vector.h:87
Quaternion operator+(const Quaternion &q) const
Definition: g_quaternion.h:216
static void set_epsilon(float e)
Definition: g_quaternion.cpp:554
Euler_mode
Definition: g_quaternion.h:55
Definition: g_quaternion.h:79
Quaternion & set_euler_phi(double phi)
Definition: g_quaternion.cpp:491
Definition: g_quaternion.h:64
Definition: g_quaternion.h:72
Definition: g_quaternion.h:74
Vector get_imag() const
returns vector [x, y, z]
Definition: g_quaternion.cpp:314
Definition: g_quaternion.h:61
Definition: g_quaternion.h:61
Definition: g_quaternion.h:99
Definition: g_quaternion.h:66
bool operator==(const Quaternion &) const
Definition: g_quaternion.cpp:793
Definition: g_quaternion.h:56
double get_real() const
returns w
Definition: g_quaternion.cpp:324
static const Euler_axis EulSafe[4]
Definition: g_quaternion.h:310
Definition: g_quaternion.h:94
Definition: g_quaternion.h:58
Definition: g_quaternion.h:77
Definition: g_quaternion.h:71
Definition: g_quaternion.h:62
Definition: g_quaternion.h:63
Quaternion & operator-=(const Quaternion &)
This is simple 4-vector subtraction. If you want to invert a rotation, don't use this–multiply by the...
Definition: g_quaternion.cpp:713
Definition: g_quaternion.h:40
Definition: g_quaternion.h:85
Definition: g_quaternion.h:64
Quaternion clone() const
Definition: g_quaternion.cpp:243
Quaternion & set_from_directions(const Vector &d1, const Vector &d2)
Find quaternion that rotates vector d1 to vector d2 in the smallest angle.
Definition: g_quaternion.cpp:412
Definition: g_quaternion.h:66
x
Definition: APPgetLargeConnectedEdges.m:100
Definition: g_quaternion.h:89
Definition: g_quaternion.h:65
Definition: g_quaternion.h:62
Quaternion slerp(const Quaternion &q1, const Quaternion &q2, double t)
Definition: g_quaternion.cpp:1366
void swap(Self &other)
Definition: g_quaternion.cpp:250
bool _gimbal_lock
Definition: g_quaternion.h:242
Definition: g_quaternion.h:83
Vector get_axis_angle() const
Definition: g_quaternion.cpp:300
Definition: g_quaternion.h:65
double norm(const Quaternion &q, unsigned int l=2)
Definition: g_quaternion.h:372
Definition: g_quaternion.h:59
Definition: g_quaternion.h:67
Euler_axis
Definition: g_quaternion.h:82
Quaternion & set_axis_angle(const Vector &, double angle)
Definition: g_quaternion.cpp:370
Definition: g_quaternion.h:68
double magnitude() const
Definition: g_quaternion.h:180
Quaternion & operator=(const Quaternion &)
Definition: g_quaternion.cpp:617
const Vector & get_axis() const
Definition: g_quaternion.cpp:288
Quaternion & set_euler_mode(Euler_mode m)
Definition: g_quaternion.cpp:516
Definition: g_quaternion.h:75
Euler_mode get_euler_mode() const
Definition: g_quaternion.cpp:529
Quaternion & init_identity()
Definition: g_quaternion.cpp:270
Definition: g_quaternion.h:70
Definition: g_quaternion.h:76
friend Quaternion nlerp(const Quaternion &q1, const Quaternion &q2, double t)
Definition: g_quaternion.cpp:1442
const Vector & get_euler_angles() const
returns vector [phi, theta, psi]
Definition: g_quaternion.cpp:308
Definition: g_quaternion.h:56
Definition: g_quaternion.h:73
Quaternion operator*(const Quaternion &) const
Definition: g_quaternion.cpp:862
Quaternion & set_euler_angles(double phi, double theta, double psi)
Definition: g_quaternion.cpp:471
double norm(unsigned int l=2) const
compute the L-* norm
Definition: g_quaternion.cpp:826
Quaternion & operator+=(const Quaternion &)
Definition: g_quaternion.cpp:690
Definition: g_quaternion.h:59
Definition: g_quaternion.h:57
Quaternion operator-(const Quaternion &q) const
Definition: g_quaternion.h:223
Definition: g_quaternion.h:72
double get_angle() const
Definition: g_quaternion.cpp:294
static void set_gimbal_lock_epsilon(float e)
Definition: g_quaternion.cpp:544
Definition: g_quaternion.h:67
Definition: g_quaternion.h:60
Definition: g_quaternion.h:37
get the indices of edges in each direction for i
Definition: APPgetLargeConnectedEdges.m:48
static float get_epsilon()
Definition: g_quaternion.cpp:559
Definition: g_quaternion.h:57
Euler_repeat
Definition: g_quaternion.h:93
Definition: g_quaternion.h:58
This class implements matrices, in the linear-algebra sense, with real-valued elements.
Definition: m_matrix.h:94
Quaternion & operator*=(const Quaternion &)
Definition: g_quaternion.cpp:637
for m
Definition: APPgetLargeConnectedEdges.m:64
Definition: g_quaternion.h:60
static Euler_mode get_default_euler_mode()
Definition: g_quaternion.cpp:539
Definition: g_quaternion.h:77
static float get_gimbal_lock_epsilon()
Definition: g_quaternion.cpp:549
Definition: g_quaternion.h:74
Definition: g_quaternion.h:84
Definition for the Vector class, a thin wrapper on the KJB Vector struct and its related functionalit...
Quaternion & set_euler_theta(double theta)
Definition: g_quaternion.cpp:500
Definition: g_quaternion.h:76
Quaternion & operator/=(const Quaternion &)
Definition: g_quaternion.cpp:662
Quaternion()
Definition: g_quaternion.cpp:45
Definition: g_quaternion.h:78
Definition: g_quaternion.h:95
Quaternion slerp2(const Quaternion &q1, const Quaternion &q2, double t)
Definition: g_quaternion.cpp:1402
Definition: g_quaternion.h:70