CrystalSpace

Public API Reference

csgeom/quaternion.h

Go to the documentation of this file.
00001 /*
00002     Copyright (C) 2000 by Norman Kramer
00003                   2006 by Marten Svanfeldt 
00004 
00005     This library is free software; you can redistribute it and/or
00006     modify it under the terms of the GNU Library General Public
00007     License as published by the Free Software Foundation; either
00008     version 2 of the License, or (at your option) any later version.
00009 
00010     This library is distributed in the hope that it will be useful,
00011     but WITHOUT ANY WARRANTY; without even the implied warranty of
00012     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013     Library General Public License for more details.
00014 
00015     You should have received a copy of the GNU Library General Public
00016     License along with this library; if not, write to the Free
00017     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
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 
00041 class CS_CRYSTALSPACE_EXPORT csQuaternion
00042 {
00043 public:
00044   // Constructors
00045 
00047   csQuaternion ()
00048     : v (0.0f), w (1.0f)
00049   {}
00050 
00052   csQuaternion (float x, float y, float z, float w)
00053     : v (x, y, z), w (w)
00054   {}
00055 
00057   csQuaternion (const csVector3& v, float w)
00058     : v (v), w (w)
00059   {}
00060 
00062   csQuaternion (const csQuaternion& q)
00063     : v (q.v), w (q.w)
00064   {}
00065   
00067   inline void SetIdentity () 
00068   {
00069     v.Set (0.0f); w = 1.0f;
00070   }
00071 
00073   inline friend csQuaternion operator+ (const csQuaternion& q1, 
00074     const csQuaternion& q2)
00075   {
00076     return csQuaternion (q1.v+q2.v, q1.w+q2.w);
00077   }
00078 
00080   inline csQuaternion& operator+= (const csQuaternion& q)
00081   {
00082     v += q.v; w += q.w;
00083     return *this;
00084   }
00085 
00087   inline friend csQuaternion operator- (const csQuaternion& q1, 
00088     const csQuaternion& q2)
00089   {
00090     return csQuaternion (q1.v-q2.v, q1.w-q2.w);
00091   }
00092 
00094   inline csQuaternion& operator-= (const csQuaternion& q)
00095   {
00096     v -= q.v; w -= q.w;
00097     return *this;
00098   }
00099   
00101   inline friend csQuaternion operator- (const csQuaternion& q)
00102   {
00103     return csQuaternion (-q.v, -q.w);
00104   }
00105 
00107   inline friend csQuaternion operator* (const csQuaternion& q1,
00108     const csQuaternion& q2)
00109   {
00110     return csQuaternion (q1.v*q2.w + q1.w*q2.v + q1.v%q2.v, 
00111       q1.w*q2.w - q1.v*q2.v);
00112   }
00113 
00115   inline csQuaternion& operator*= (const csQuaternion& q)
00116   {
00117     csVector3 newV = v*q.w + w*q.v + v%q.v;
00118     w = w*q.w - v*q.v;
00119     v = newV;
00120     return *this;
00121   }
00122 
00124   inline friend csQuaternion operator* (const csQuaternion q, float f)
00125   {
00126     return csQuaternion (q.v*f, q.w*f);
00127   }
00128 
00130   inline friend csQuaternion operator* (float f, const csQuaternion q)
00131   {
00132     return csQuaternion (q.v*f, q.w*f);
00133   }
00134 
00136   inline friend csQuaternion operator/ (const csQuaternion q, float f)
00137   {
00138     float invF = 1.0f/f;
00139     return csQuaternion (q.v*invF, q.w*invF);
00140   }
00141 
00143   inline friend csQuaternion operator/ (float f, const csQuaternion q)
00144   {
00145     float invF = 1.0f/f;
00146     return csQuaternion (q.v*invF, q.w*invF);
00147   }
00148 
00150   inline csQuaternion GetConjugate () const
00151   {
00152     return csQuaternion (-v, w);
00153   }
00154 
00156   inline void Conjugate () 
00157   {
00158     v = -v;
00159   }
00160 
00162   inline float Dot (const csQuaternion& q) const
00163   {
00164     return v*q.v + w*q.w;
00165   }
00166 
00168   inline float SquaredNorm () const
00169   {
00170     return Dot (*this);
00171   }
00172 
00174   inline float Norm () const
00175   {
00176     return csQsqrt (SquaredNorm ());
00177   }
00178 
00184   inline csQuaternion Unit () const
00185   {
00186     return (*this) / Norm ();
00187   }
00188 
00192   inline csVector3 Rotate (const csVector3& src) const
00193   {
00194     csQuaternion p (src, 0);
00195     csQuaternion q = *this * p;
00196     q *= GetConjugate ();
00197     return q.v;
00198   }
00199 
00207   inline void SetAxisAngle (const csVector3& axis, float angle)
00208   {
00209     v = axis * sinf (angle / 2.0f);
00210     w = cosf (angle / 2.0f);
00211   }
00212 
00220   inline void GetAxisAngle (csVector3& axis, float& angle) const
00221   {
00222     angle = 2.0f * acosf (w);
00223     if (v.SquaredNorm () != 0)
00224       axis = v.Unit ();
00225     else
00226       axis.Set (1.0f, 0.0f, 0.0f);
00227   }
00228 
00232   void SetEulerAngles (const csVector3& angles);
00233 
00237   csVector3 GetEulerAngles () const; 
00238 
00242   void SetMatrix (const csMatrix3& matrix);
00243 
00247   csMatrix3 GetMatrix () const;
00248 
00253   csQuaternion NLerp (const csQuaternion& q2, float t) const;
00254 
00259   csQuaternion SLerp (const csQuaternion& q2, float t) const;
00260 
00264   csQuaternion Log () const;
00265 
00269   csQuaternion Exp () const;
00270 
00276   csQuaternion Squad (const csQuaternion & t1, const csQuaternion & t2,
00277     const csQuaternion & q, float t) const;
00278 
00279   // Data
00280   csVector3 v;
00281   float w;
00282 };
00283 
00286 #endif // __CS_QUATERNION_H__
00287 

Generated for Crystal Space by doxygen 1.4.7