00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef LUX_QUATERNION_H
00024 #define LUX_QUATERNION_H
00025
00026 #include "lux.h"
00027 #include "vector.h"
00028
00029 namespace lux
00030 {
00031
00032 class Quaternion {
00033
00034 public:
00035 float w;
00036 Vector v;
00037
00038
00039 Quaternion(const boost::shared_ptr<Matrix4x4> m);
00040 Quaternion();
00041 Quaternion(const Quaternion &q);
00042
00043
00044 friend Quaternion operator +( const Quaternion& q1, const Quaternion& q2 ) {
00045 Quaternion q;
00046 q.v = q1.v + q2.v;
00047 q.w = q1.w + q2.w;
00048 return q;
00049 }
00050
00051 friend Quaternion operator -( const Quaternion& q1, const Quaternion& q2 ) {
00052 Quaternion q;
00053 q.v = q1.v - q2.v;
00054 q.w = q1.w - q2.w;
00055 return q;
00056 }
00057
00058
00059 friend Quaternion operator *( const Quaternion& q1, const Quaternion& q2 ) {
00060 Quaternion q;
00061 q.w = q1.w*q2.w - Dot(q1.v, q2.v);
00062 q.v = q1.w*q2.v + q2.w*q1.v + Cross(q1.v, q2.v);
00063 return q;
00064 }
00065
00066 friend Quaternion operator *( const float& f, const Quaternion& q1 ) {
00067 Quaternion q(q1);
00068 q.w = q.w * f;
00069 q.v = q.v * f;
00070 return q;
00071 }
00072
00073 inline void Normalize() {
00074 float len = sqrt(w*w + Dot(v, v));
00075 w = w/len;
00076 v = v * (1.0/len);
00077 }
00078
00079
00080 void ToMatrix(float m[4][4]) const;
00081
00082 static Quaternion Slerp(float t, const Quaternion &q1, const Quaternion &q2);
00083 };
00084
00085 float Dot(const Quaternion &q1, const Quaternion &q2);
00086
00087 }
00088
00089
00090 #endif // LUX_QUATERNION_H