Lumino.Math
|
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