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 
00042 class CS_CRYSTALSPACE_EXPORT csQuaternion
00043 {
00044 public:
00045   // Constructors
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 

Generated for Crystal Space 2.0 by doxygen 1.7.6.1