KrisLibrary  1.0.0
rotation.h
Go to the documentation of this file.
1 #ifndef MATH3D_ROTATION_H
2 #define MATH3D_ROTATION_H
3 
4 #include <KrisLibrary/math/complex.h>
5 #include "primitives.h"
6 
12 namespace Math3D {
15 
16  using namespace Math;
17 
18 class EulerAngleRotation;
19 class AngleAxisRotation;
20 class MomentRotation;
21 class QuaternionRotation;
22 
31 {
32 public:
35  explicit EulerAngleRotation(const Vector3&);
36  explicit EulerAngleRotation(Real a, Real b, Real c);
37 
38  //inline operator const Vector3&() const { return *this; }
39  //inline operator Vector3&() { return *this; }
40 
41  //inline void set(const EulerAngleRotation& r) { Vector3::set(r.x,r.y,r.z); }
42  inline void setIdentity() { setZero(); }
43 
46  bool setMatrix(int u,int v,int w,const Matrix3&);
47  bool setMatrixXYZ(const Matrix3&);
48  bool setMatrixXZY(const Matrix3&);
49  bool setMatrixYZX(const Matrix3&);
50  bool setMatrixYXZ(const Matrix3&);
51  bool setMatrixZXY(const Matrix3&);
52  bool setMatrixZYX(const Matrix3&);
53 
54  void getMatrix(int u,int v,int w,Matrix3&) const;
55  void getMatrixXYZ(Matrix3&) const;
56  void getMatrixXZY(Matrix3&) const;
57  void getMatrixYZY(Matrix3&) const;
58  void getMatrixYXZ(Matrix3&) const;
59  void getMatrixZXY(Matrix3&) const;
60  void getMatrixZYX(Matrix3&) const;
61 };
62 
69 {
70 public:
73  explicit AngleAxisRotation(Real angle, const Vector3& axis);
74  explicit AngleAxisRotation(const MomentRotation&);
75 
76  void set(const AngleAxisRotation&);
77  void set(Real angle, const Vector3& axis);
78  void setAxis(const Vector3& axis);
79  void setIdentity();
80  void transformPoint(const Vector3& in,Vector3& out) const;
81 
82  bool setMatrix(const Matrix3&);
83  void getMatrix(Matrix3&) const;
84 
85  void setMoment(const MomentRotation&);
86  void getMoment(MomentRotation&) const;
87 
88  Real angle;
89  Vector3 axis;
90 };
91 
99 class MomentRotation : public Vector3
100 {
101 public:
102  MomentRotation();
104  explicit MomentRotation(Real x,Real y,Real z);
105  explicit MomentRotation(const Vector3& v);
106  explicit MomentRotation(const AngleAxisRotation&);
107 
108  //inline operator const Vector3&() const { return *this; }
109  //inline operator Vector3&() { return *this; }
110 
111  inline void set(const MomentRotation& r) { Vector3::set(r); }
112  inline void set(const Vector3& v) { Vector3::set(v); }
113  inline void set(Real x, Real y, Real z) { Vector3::set(x,y,z); }
114  inline void setIdentity() { Vector3::setZero(); }
115  void transformPoint(const Vector3& in,Vector3& out) const;
116 
117  bool setMatrix(const Matrix3&);
118  void getMatrix(Matrix3&) const;
119 
120  void setAngleAxis(const AngleAxisRotation&);
121  void getAngleAxis(AngleAxisRotation&) const;
122 };
123 
132 {
133 public:
137  QuaternionRotation(Real w, Real x, Real y, Real z);
138 
139  //inline operator Quaternion&() { return *this; }
140  //inline operator const Quaternion&() const { return *this; }
141  void slerp(const Quaternion& a, const Quaternion& b, Real t);
142  void mag(const Quaternion& a, Real t);
143  void transform(const Vector3& a, Vector3& out) const;
144 
145  inline void set(const QuaternionRotation& q) { Quaternion::set(q); }
146  inline void setIdentity() { Quaternion::set(One); }
147  void setAngleAxis(const AngleAxisRotation&);
148  void setMoment(const MomentRotation&);
149  bool setMatrix(const Matrix3&);
150 
151  void getAngleAxis(AngleAxisRotation&) const;
152  void getMoment(MomentRotation&) const;
153  void getMatrix(Matrix3&) const;
154 };
155 
156 void SetMatrixRotationZYX(Matrix3&, const Vector3&); //euler
157 void SetMatrixRotationZYX(Matrix4&, const Vector3&);
158 void SetMatrixRotationVector(Matrix3&, const Vector3&); //moment
159 void SetMatrixRotationVector(Matrix4&, const Vector3&);
160 void SetMatrixRotationVector(Matrix3&, const Vector3&, Real angle); //angle axis
161 void SetMatrixRotationVector(Matrix4&, const Vector3&, Real angle);
162 void SetMatrixRotationQuaternion(Matrix3&, const Quaternion&); //quaternion
163 void SetMatrixRotationQuaternion(Matrix4&, const Quaternion&);
164 
165 
167 void SLerp(const Quaternion& q0,
168  const Quaternion& q1,
169  Quaternion& out,
170  Real t);
171 
173 void SCerp(const Quaternion& q_1,
174  const Quaternion& q0,
175  const Quaternion& q1,
176  const Quaternion& q2,
177  Quaternion& out,
178  Real t);
179 
184 void SBezier(const Quaternion& q0,
185  const Quaternion& c0,
186  const Quaternion& c1,
187  const Quaternion& q1,
188  Quaternion& out,
189  Real t);
190 
192 }
193 
194 #endif
void SLerp(const Quaternion &a, const Quaternion &b, Quaternion &out, Real t)
Linear quaternion rotation interpolation.
Definition: rotation.cpp:822
A 3D vector class.
Definition: math3d/primitives.h:136
Class declarations for useful 3D math types.
void SBezier(const Quaternion &q0, const Quaternion &c0, const Quaternion &c1, const Quaternion &q1, Quaternion &out, Real t)
Bezier-style quaternion rotation interpolation.
Definition: rotation.cpp:876
"Moment", a.k.a. exponential map, 3D rotation parameterization
Definition: rotation.h:99
Quaternion, a.k.a. Euler parameter, 3D rotation parameterization.
Definition: rotation.h:131
A 4x4 matrix class.
Definition: math3d/primitives.h:626
Contains all the definitions in the Math3D package.
Definition: AnyGeometry.h:13
Complex quaternion class (w + ix + jy + kz).
Definition: complex.h:133
A 3x3 matrix class.
Definition: math3d/primitives.h:469
Euler angle 3D rotation parameterization.
Definition: rotation.h:30
Contains all definitions in the Math package.
Definition: WorkspaceBound.h:12
void SCerp(const Quaternion &q_1, const Quaternion &q0, const Quaternion &q1, const Quaternion &q2, Quaternion &out, Real t)
Cubic quaternion rotation interpolation.
Definition: rotation.cpp:853
Angle-axis 3D rotation parameterization.
Definition: rotation.h:68