My Project
ParaQuaternion.h
1 #pragma once
2 #include "ParaMath.h"
3 
4 namespace ParaEngine {
5 
10  class Quaternion
11  {
12  public:
13  // special values
14  static const Quaternion ZERO;
15  static const Quaternion IDENTITY;
16 
17  float x, y, z, w;
18  public:
19  inline Quaternion(float fX = 0.0, float fY = 0.0, float fZ = 0.0, float fW = 1.0)
20  {
21  x = fX;
22  y = fY;
23  z = fZ;
24  w = fW;
25  }
27  inline Quaternion(const Matrix3& rot)
28  {
29  this->FromRotationMatrix(rot);
30  }
31 
32  inline Quaternion(const Matrix4& rot)
33  {
34  this->FromRotationMatrix(rot);
35  }
36 
40  Quaternion(const Vector3& a, const Vector3& b);
41 
43  inline Quaternion(const Radian& rfAngle, const Vector3& rkAxis)
44  {
45  this->FromAngleAxis(rfAngle, rkAxis);
46  }
47 
49  inline Quaternion(const Vector3& rkAxis, float fAngle)
50  {
51  this->FromAngleAxis(Radian(fAngle), rkAxis);
52  }
53 
54 
56  inline Quaternion(const Vector3& xaxis, const Vector3& yaxis, const Vector3& zaxis)
57  {
58  this->FromAxes(xaxis, yaxis, zaxis);
59  }
61  inline Quaternion(const Vector3* akAxis)
62  {
63  this->FromAxes(akAxis);
64  }
66  inline Quaternion(float* valptr)
67  {
68  memcpy(&x, valptr, sizeof(float)*4);
69  }
70 
72  inline float operator [] ( const size_t i ) const
73  {
74  assert( i < 4 );
75 
76  return *(&x+i);
77  }
78 
80  inline float& operator [] ( const size_t i )
81  {
82  assert( i < 4 );
83 
84  return *(&x+i);
85  }
86 
88  inline float* ptr()
89  {
90  return &x;
91  }
92 
94  inline const float* ptr() const
95  {
96  return &x;
97  }
98 
99  void FromRotationMatrix (const Matrix3& kRot);
100  void FromRotationMatrix(const Matrix4& kRot);
101 
102  void ToRotationMatrix (Matrix3& kRot) const;
103  void ToRotationMatrix(Matrix4& kRot, const Vector3& Origin) const;
104  void FromAngleAxis (const Radian& rfAngle, const Vector3& rkAxis);
105  void ToAngleAxis (Radian& rfAngle, Vector3& rkAxis) const;
106  inline void ToAngleAxis (Degree& dAngle, Vector3& rkAxis) const {
107  Radian rAngle;
108  ToAngleAxis ( rAngle, rkAxis );
109  dAngle = rAngle;
110  }
111  void FromAxes (const Vector3* akAxis);
112  void FromAxes (const Vector3& xAxis, const Vector3& yAxis, const Vector3& zAxis);
113  void ToAxes (Vector3* akAxis) const;
114  void ToAxes (Vector3& xAxis, Vector3& yAxis, Vector3& zAxis) const;
116  Vector3 xAxis(void) const;
118  Vector3 yAxis(void) const;
120  Vector3 zAxis(void) const;
121 
122  inline Quaternion& operator= (const Quaternion& rkQ)
123  {
124  x = rkQ.x;
125  y = rkQ.y;
126  z = rkQ.z;
127  w = rkQ.w;
128  return *this;
129  }
130  Quaternion operator+ (const Quaternion& rkQ) const;
131  Quaternion operator- (const Quaternion& rkQ) const;
132  Quaternion operator* (const Quaternion& rkQ) const;
133  Quaternion operator* (float fScalar) const;
134  friend Quaternion operator* (float fScalar,
135  const Quaternion& rkQ);
136  Quaternion operator- () const;
137  inline bool operator== (const Quaternion& rhs) const
138  {
139  return (rhs.x == x) && (rhs.y == y) && (rhs.z == z) && (rhs.w == w);
140  }
141  inline bool operator!= (const Quaternion& rhs) const
142  {
143  return !operator==(rhs);
144  }
145  // functions of a quaternion
146  float Dot (const Quaternion& rkQ) const; // dot product
147  float Norm () const; // squared-length
149  float normalise(void);
150  Quaternion Inverse () const; // apply to non-zero quaternion
151  Quaternion UnitInverse () const; // apply to unit-length quaternion
152  Quaternion Exp () const;
153  Quaternion Log () const;
154 
155  inline Quaternion& invertWinding() {
156  x = -x; y = -y; z = -z;
157  return *this;
158  }
159 
160  // rotation of a vector by a quaternion
161  Vector3 operator* (const Vector3& rkVector) const;
162 
171  Radian getRoll(bool reprojectAxis = true) const;
180  Radian getPitch(bool reprojectAxis = true) const;
189  Radian getYaw(bool reprojectAxis = true) const;
190 
191  void ToRadians(float *outX, float *outY, float *outZ) const;
192 
194  bool equals(const Quaternion& rhs, const Radian& tolerance) const;
195 
196  // spherical linear interpolation
197  static Quaternion Slerp (float fT, const Quaternion& rkP, const Quaternion& rkQ, bool shortestPath = false);
198 
199  static Quaternion SlerpExtraSpins (float fT, const Quaternion& rkP, const Quaternion& rkQ,
200  int iExtraSpins);
201 
202  // setup for spherical quadratic interpolation
203  static void Intermediate (const Quaternion& rkQ0, const Quaternion& rkQ1, const Quaternion& rkQ2, Quaternion& rka, Quaternion& rkB);
204 
205  // spherical quadratic interpolation
206  static Quaternion Squad (float fT, const Quaternion& rkP, const Quaternion& rkA, const Quaternion& rkB, const Quaternion& rkQ, bool shortestPath = false);
207 
208  // normalised linear interpolation - faster but less accurate (non-constant rotation velocity)
209  static Quaternion nlerp(float fT, const Quaternion& rkP, const Quaternion& rkQ, bool shortestPath = false);
210 
211  // cutoff for sine near zero
212  static const float ms_fEpsilon;
213 
217  inline friend std::ostream& operator <<
218  ( std::ostream& o, const Quaternion& q )
219  {
220  o << "Quaternion(" << q.x << ", " << q.y << ", " << q.z << ", " << q.w << ")";
221  return o;
222  }
223 
224  };
225 
226 }
Wrapper class which indicates a given angle value is in Radians.
Definition: ParaAngle.h:10
Quaternion(const Radian &rfAngle, const Vector3 &rkAxis)
Construct a quaternion from an angle/axis.
Definition: ParaQuaternion.h:43
Radian getPitch(bool reprojectAxis=true) const
Calculate the local pitch element of this quaternion.
Definition: ParaQuaternion.cpp:593
bool equals(const Quaternion &rhs, const Radian &tolerance) const
Equality with tolerance (tolerance is max angle difference)
Definition: ParaQuaternion.cpp:471
float * ptr()
Pointer accessor for direct copying.
Definition: ParaQuaternion.h:88
different physics engine has different winding order.
Definition: EventBinding.h:32
Vector3 xAxis(void) const
Get the local x-axis.
Definition: ParaQuaternion.cpp:263
Implementation of a Quaternion, i.e.
Definition: ParaQuaternion.h:10
A 3x3 matrix which can represent rotations around axes.
Definition: ParaMatrix3.h:63
Standard 3-dimensional vector.
Definition: ParaVector3.h:16
Quaternion(float *valptr)
Construct a quaternion from 4 manual w/x/y/z values.
Definition: ParaQuaternion.h:66
Wrapper class which indicates a given angle value is in Degrees.
Definition: ParaAngle.h:56
float normalise(void)
Normalizes this quaternion, and returns the previous length.
Definition: ParaQuaternion.cpp:560
Radian getRoll(bool reprojectAxis=true) const
Calculate the local roll element of this quaternion.
Definition: ParaQuaternion.cpp:568
float operator[](const size_t i) const
Array accessor operator.
Definition: ParaQuaternion.h:72
Class encapsulating a standard 4x4 homogeneous matrix.
Definition: ParaMatrix4.h:23
Quaternion(const Vector3 &xaxis, const Vector3 &yaxis, const Vector3 &zaxis)
Construct a quaternion from 3 orthonormal local axes.
Definition: ParaQuaternion.h:56
Vector3 yAxis(void) const
Get the local y-axis.
Definition: ParaQuaternion.cpp:278
Radian getYaw(bool reprojectAxis=true) const
Calculate the local yaw element of this quaternion.
Definition: ParaQuaternion.cpp:617
Quaternion(const Vector3 *akAxis)
Construct a quaternion from 3 orthonormal local axes.
Definition: ParaQuaternion.h:61
const float * ptr() const
Pointer accessor for direct copying.
Definition: ParaQuaternion.h:94
Quaternion(const Vector3 &rkAxis, float fAngle)
Construct a quaternion from an angle/axis.
Definition: ParaQuaternion.h:49
Quaternion(const Matrix3 &rot)
Construct a quaternion from a rotation matrix.
Definition: ParaQuaternion.h:27
Vector3 zAxis(void) const
Get the local z-axis.
Definition: ParaQuaternion.cpp:293