C:/Users/Mike/Documents/Visual Studio Projects/GameEngine/src/Quaternion.cpp

Go to the documentation of this file.
00001 #include "Quaternion.h"
00002 #include "GameUtils.h"
00003 
00004 namespace GameEngine {
00005 
00006         const Quaternion Quaternion::IDENTITY( 1, 0, 0, 0 );
00007 
00008         Quaternion::Quaternion()
00009                 :       mW(0),
00010                         mX(0),
00011                         mY(0),
00012                         mZ(0)
00013         {
00014 
00015         }
00016 
00017 
00018         Quaternion::Quaternion(const Quaternion& q)
00019                 :       mW(q.mW),
00020                         mX(q.mX),
00021                         mY(q.mY),
00022                         mZ(q.mZ)
00023         {
00024 
00025         }
00026 
00027 
00028         Quaternion::Quaternion(Real w, Real x, Real y, Real z)
00029                 :       mW(w),
00030                         mX(x),
00031                         mY(y),
00032                         mZ(z)
00033         {
00034 
00035         }
00036 
00037 
00038         Quaternion::~Quaternion()
00039         {
00040         }
00041 
00042 
00043 
00044         Quaternion& Quaternion::normalise()
00045         {
00046                 float mag = (float) sqrt(mW*mW + mX*mX + mY*mY + mZ*mZ);
00047 
00048                 // Magnitude must be greater than 0
00049                 if(mag > 0.0f){
00050                         float oneOverMag = 1.0f / mag;
00051                         mW *= oneOverMag;
00052                         mX *= oneOverMag;
00053                         mY *= oneOverMag;
00054                         mZ *= oneOverMag;
00055 
00056                         
00057                         return *this;
00058                 }
00059                 else{
00060                         // Mag < 0, problems!
00061                         assert(false);
00062                 }
00063 
00064         }
00065 
00066 
00067 
00068     Real Quaternion::getYawDeg() const
00069     {
00070         return RadToDeg( atan2( 2 * ( mX * mY + mW * mZ ),
00071                                 mW * mW + mX * mX - mY * mY -
00072                                 mZ * mZ ) );
00073     }
00074 
00075         Real Quaternion::getYawRad() const
00076         {
00077                 return atan2( 2 * ( mX * mY + mW * mZ ), mW * mW + mX * mX - mY * mY - mZ * mZ );
00078         }
00079 
00080 
00081 
00082     Real Quaternion::getPitchDeg() const
00083     {
00084         return RadToDeg( asin( -2 * ( mX * mZ - mW * mY ) ) );
00085     }
00086 
00087         Real Quaternion::getPitchRad() const
00088     {
00089         return asin( -2 * ( mX * mZ - mW * mY ) );
00090     }
00091 
00092 
00093 
00094         Real Quaternion::getRollDeg() const
00095     {
00096         return RadToDeg( atan2( 2 * ( mY * mZ + mW * mX ),
00097                                 mW * mW - mX * mX - mY * mY + mZ * mZ ) );
00098     }
00099 
00100         Real Quaternion::getRollRad() const
00101     {
00102         return atan2( 2 * ( mY * mZ + mW * mX ), 
00103                                                 mW * mW - mX * mX - mY * mY + mZ * mZ );
00104     }
00105 
00106 
00107 
00108         Vector3 Quaternion::operator* (const Vector3& v) const
00109     {
00110                 Vector3 uv, uuv;
00111                 Vector3 qvec(mX, mY, mZ);
00112 
00113                 uv = qvec.cross(v);
00114                 uuv = qvec.cross(uv);
00115                 uv *= (2.0f * mW);
00116                 uuv *= 2.0f;
00117 
00118                 return v + uv + uuv;
00119 
00120     }
00121 
00122 }

Generated on Thu Apr 19 09:47:02 2007 for GameEngine by  doxygen 1.5.2