Lumino.Math
D:/Proj/Lumino.Math/include/Lumino/Math/Quaternion.h
00001 
00002 #ifndef LUMINO_MATH_QUATERNION_H
00003 #define LUMINO_MATH_QUATERNION_H
00004 
00005 #include <stdio.h>
00006 #include "Common.h"
00007 
00008 namespace Lumino
00009 {
00010 class Vector3;
00011 class Matrix;
00012 
00024 class LUMINO_EXPORT Quaternion
00025 {
00026 public:
00027 
00028     float   X;      
00029     float   Y;      
00030     float   Z;      
00031     float   W;      
00032 
00033 public:
00034 
00035     static const Quaternion Identity;   
00036 
00037 public:
00038 
00042     Quaternion();
00043 
00047     Quaternion(float x, float y, float z, float w);
00048     
00055     Quaternion(const Vector3& axis, float r);
00056 
00057 public:
00058 
00062     void Set(float x, float y, float z, float w);
00063 
00067     float GetLength() const;
00068 
00072     float GetLengthSquared() const;
00073     
00077     void Normalize();
00078     
00083     bool IsIdentity() const;
00084 
00089     void Multiply(const Quaternion& qua);
00090 
00095     void RotateX(float angle);
00096 
00101     void RotateY(float angle);
00102 
00107     void RotateZ(float angle);
00108     
00115     void RotateAxis(const Vector3& axis, float r);
00116 
00126     Vector3 ToEulerAngles(RotationOrder order = RotationOrder_ZXY, bool* locked = NULL) const;
00127 
00134     void ToAxisAngle(Vector3* axis, float* angle) const;
00135     
00139     bool IsNaNOrInf() const;
00140 
00147     void Print(const char* format = NULL, FILE* stream = NULL) const;
00148 
00149 public:
00150 
00156     static Quaternion Normalize(const Quaternion& qua);
00157     
00163     static Quaternion Conjugate(const Quaternion& qua);
00164     
00171     static float Dot(const Quaternion& qua1, const Quaternion& qua2);
00172     
00178     static Quaternion Inverse(const Quaternion& qua);
00179 
00186     static Quaternion Multiply(const Quaternion& qua1, const Quaternion& qua2);
00187     
00195     static Quaternion RotationAxis(const Vector3& axis, float r);
00196     
00202     static Quaternion RotationMatrix(const Matrix& mat);
00203     
00214     static Quaternion RotationYawPitchRoll(float yaw, float pitch, float roll);
00215 
00222     static Quaternion RotationEulerAngles(const Vector3& angles, RotationOrder order = RotationOrder_ZXY);
00223 
00232     static Quaternion Slerp(const Quaternion& qua1, const Quaternion& qua2, float t);
00233 
00234 public:
00235     
00236     Quaternion& operator += (const Quaternion& v);
00237     Quaternion& operator += (float v);
00238     Quaternion& operator -= (const Quaternion& v);
00239     Quaternion& operator -= (float v);
00240     Quaternion& operator *= (const Quaternion& v);  
00241     Quaternion& operator *= (float v);
00242     Quaternion& operator /= (float v);
00243 
00244     friend Quaternion operator + (const Quaternion& v1, const Quaternion& v2);
00245     friend Quaternion operator + (const Quaternion& v1, float v2);
00246     friend Quaternion operator + (float v1,             const Quaternion& v2);
00247     friend Quaternion operator - (const Quaternion& v1, const Quaternion& v2);
00248     friend Quaternion operator - (const Quaternion& v1, float v2);
00249     friend Quaternion operator - (float v1,             const Quaternion& v2);
00250     friend Quaternion operator * (const Quaternion& v1, const Quaternion& v2);  
00251     friend Quaternion operator * (const Quaternion& v1, float v2);
00252     friend Quaternion operator * (float v1,             const Quaternion& v2);
00253     friend Quaternion operator / (const Quaternion& v1, float v2);
00254 
00255     friend Quaternion operator - (const Quaternion& v1);
00256 
00257     bool operator == (const Quaternion& v) const;
00258     bool operator != (const Quaternion& v) const;
00259 
00260 };
00261 
00262 } // namespace Lumino
00263 
00264 #include "Quaternion.inl"
00265 
00266 #endif // LUMINO_MATH_QUATERNION_H
 All Classes Functions Variables Friends