Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef __CS_QUATERNION_H__
00021 #define __CS_QUATERNION_H__
00022
00030 #include "csextern.h"
00031 #include "csqsqrt.h"
00032
00033 #include "csgeom/vector3.h"
00034
00035 class csMatrix3;
00036
00042 class CS_CRYSTALSPACE_EXPORT csQuaternion
00043 {
00044 public:
00045
00046
00048 csQuaternion ()
00049 : v (0.0f), w (1.0f)
00050 {}
00051
00053 csQuaternion (float x, float y, float z, float w)
00054 : v (x, y, z), w (w)
00055 {}
00056
00058 csQuaternion (const csVector3& v, float w)
00059 : v (v), w (w)
00060 {}
00061
00063 csQuaternion (const csQuaternion& q)
00064 : v (q.v), w (q.w)
00065 {}
00066
00070 inline void Set (float x, float y, float z, float w)
00071 {
00072 v.x = x;
00073 v.y = y;
00074 v.z = z;
00075 this->w = w;
00076 }
00077
00079 inline void SetIdentity ()
00080 {
00081 v.Set (0.0f); w = 1.0f;
00082 }
00083
00085 inline friend csQuaternion operator+ (const csQuaternion& q1,
00086 const csQuaternion& q2)
00087 {
00088 return csQuaternion (q1.v+q2.v, q1.w+q2.w);
00089 }
00090
00092 inline csQuaternion& operator+= (const csQuaternion& q)
00093 {
00094 v += q.v; w += q.w;
00095 return *this;
00096 }
00097
00099 inline friend csQuaternion operator- (const csQuaternion& q1,
00100 const csQuaternion& q2)
00101 {
00102 return csQuaternion (q1.v-q2.v, q1.w-q2.w);
00103 }
00104
00106 inline csQuaternion& operator-= (const csQuaternion& q)
00107 {
00108 v -= q.v; w -= q.w;
00109 return *this;
00110 }
00111
00113 inline friend csQuaternion operator- (const csQuaternion& q)
00114 {
00115 return csQuaternion (-q.v, -q.w);
00116 }
00117
00119 inline friend csQuaternion operator* (const csQuaternion& q1,
00120 const csQuaternion& q2)
00121 {
00122 return csQuaternion (q1.v*q2.w + q1.w*q2.v + q1.v%q2.v,
00123 q1.w*q2.w - q1.v*q2.v);
00124 }
00125
00127 inline csQuaternion& operator*= (const csQuaternion& q)
00128 {
00129 csVector3 newV = v*q.w + w*q.v + v%q.v;
00130 w = w*q.w - v*q.v;
00131 v = newV;
00132 return *this;
00133 }
00134
00136 inline friend csQuaternion operator* (const csQuaternion& q, float f)
00137 {
00138 return csQuaternion (q.v*f, q.w*f);
00139 }
00140
00142 inline friend csQuaternion operator* (float f, const csQuaternion& q)
00143 {
00144 return csQuaternion (q.v*f, q.w*f);
00145 }
00146
00148 inline csQuaternion& operator*= (float f)
00149 {
00150 v *= f;
00151 w *= f;
00152
00153 return *this;
00154 }
00155
00157 inline friend csQuaternion operator/ (const csQuaternion& q, float f)
00158 {
00159 float invF = 1.0f/f;
00160 return csQuaternion (q.v*invF, q.w*invF);
00161 }
00162
00164 inline friend csQuaternion operator/ (float f, const csQuaternion& q)
00165 {
00166 float invF = 1.0f/f;
00167 return csQuaternion (q.v*invF, q.w*invF);
00168 }
00169
00171 inline csQuaternion& operator/= (float f)
00172 {
00173 float invF = 1.0f/f;
00174 v *= invF;
00175 w *= invF;
00176
00177 return *this;
00178 }
00179
00181 inline csQuaternion GetConjugate () const
00182 {
00183 return csQuaternion (-v, w);
00184 }
00185
00187 inline void Conjugate ()
00188 {
00189 v = -v;
00190 }
00191
00193 inline float Dot (const csQuaternion& q) const
00194 {
00195 return v*q.v + w*q.w;
00196 }
00197
00199 inline float SquaredNorm () const
00200 {
00201 return Dot (*this);
00202 }
00203
00205 inline float Norm () const
00206 {
00207 return csQsqrt (SquaredNorm ());
00208 }
00209
00215 inline csQuaternion Unit () const
00216 {
00217 return (*this) / Norm ();
00218 }
00219
00223 inline csVector3 Rotate (const csVector3& src) const
00224 {
00225 csQuaternion p (src, 0);
00226 csQuaternion q = *this * p;
00227 q *= GetConjugate ();
00228 return q.v;
00229 }
00230
00238 inline void SetAxisAngle (const csVector3& axis, float angle)
00239 {
00240 v = axis * sinf (angle / 2.0f);
00241 w = cosf (angle / 2.0f);
00242 }
00243
00251 inline void GetAxisAngle (csVector3& axis, float& angle) const
00252 {
00253 angle = 2.0f * acosf (w);
00254 if (v.SquaredNorm () != 0)
00255 axis = v.Unit ();
00256 else
00257 axis.Set (1.0f, 0.0f, 0.0f);
00258 }
00259
00263 void SetEulerAngles (const csVector3& angles);
00264
00268 csVector3 GetEulerAngles () const;
00269
00273 void SetMatrix (const csMatrix3& matrix);
00274
00278 csMatrix3 GetMatrix () const;
00279
00284 csQuaternion NLerp (const csQuaternion& q2, float t) const;
00285
00290 csQuaternion SLerp (const csQuaternion& q2, float t) const;
00291
00295 csQuaternion Log () const;
00296
00300 csQuaternion Exp () const;
00301
00307 csQuaternion Squad (const csQuaternion & t1, const csQuaternion & t2,
00308 const csQuaternion & q, float t) const;
00309
00311 csVector3 v;
00312
00314 float w;
00315 };
00316
00319 #endif // __CS_QUATERNION_H__
00320