12#ifndef TT_INCLUDE__QUATERNION_H
13#define TT_INCLUDE__QUATERNION_H
30 static const Quaternion IDENTITY;
51 TT_INLINE Quaternion(
void) {};
52 TT_INLINE
explicit Quaternion(
bool init) {
if (init) { X = 0.0f; Y = 0.0f; Z = 0.0f; W = 1.0f; } }
53 TT_INLINE
explicit Quaternion(
float a,
float b,
float c,
float d) { X=a; Y=b; Z=c; W=d; }
54 TT_INLINE Quaternion(
float angle,
const Vector3& axis);
56 float & operator [](
int i) {
return (&X)[i]; }
57 const float & operator [](
int i)
const {
return (&X)[i]; }
59 Quaternion conjugate() {
return Quaternion(t, -i, -j, -k); }
61 Matrix3 Build_Matrix3();
62 Matrix3D Build_Matrix3D();
63 Matrix4 Build_Matrix4();
65 static Quaternion Trackball(
float x0,
float y0,
float x1,
float y1,
float sphsize);
66 void Scale(
float s) { X = (float)(s*X); Y = (float)(s*Y); Z = (float)(s*Z); W = (float)(s*W); }
68 friend TT_INLINE Quaternion operator* (
const Vector3& a,
const Quaternion& b);
69 friend TT_INLINE Quaternion operator* (
const Quaternion& a,
const Quaternion& b);
70 bool Is_Valid(
void)
const;
71 TT_INLINE
void Make_Identity(
void) { Set(); };
72 TT_INLINE
void Set(
float a = 0.0,
float b = 0.0,
float c = 0.0,
float d = 1.0) { X = a; Y = b; Z = c; W = d; }
73 TT_INLINE Vector3 Rotate_Vector(
const Vector3 & v)
const;
78TT_INLINE Quaternion operator * (
const Vector3& a,
const Quaternion& b)
80 return Quaternion(a.X, a.Y, a.Z, 0) * b;
85TT_INLINE Quaternion operator * (
const Quaternion& a,
const Quaternion& b)
92 a.W*b.X + b.W*a.X + (a.Y*b.Z - a.Z*b.Y),
93 a.W*b.Y + b.W*a.Y + (a.Z*b.X - a.X*b.Z),
94 a.W*b.Z + b.W*a.Z + (a.X*b.Y - a.Y*b.X),
95 a.W*b.W - (a.X*b.X + a.Y*b.Y + a.Z*b.Z)
100TT_INLINE
bool Quaternion::Is_Valid(
void)
const
102 return ( Is_Valid_Float(X) &&
108TT_INLINE Vector3 Quaternion::Rotate_Vector(
const Vector3 & v)
const
110 float x = W*v.X + (Y*v.Z - v.Y*Z);
111 float y = W*v.Y - (X*v.Z - v.X*Z);
112 float z = W*v.Z + (X*v.Y - v.X*Y);
113 float w = -(X*v.X + Y*v.Y + Z*v.Z);
116 w*(-X) + W*x + (y*(-Z) - (-Y)*z),
117 w*(-Y) + W*y - (x*(-Z) - (-X)*z),
118 w*(-Z) + W*z + (x*(-Y) - (-X)*y)
122TT_INLINE Quaternion Inverse(
const Quaternion & a)
124 return Quaternion(-a[0],-a[1],-a[2],a[3]);
126Quaternion Build_Quaternion(
const Matrix3D & mat);
128TT_INLINE Quaternion operator / (
const Quaternion & a,
const Quaternion & b)
130 return a * Inverse(b);
133TT_INLINE Quaternion operator * (
float scl,
const Quaternion & a)
135 return Quaternion(scl*a[0], scl*a[1], scl*a[2], scl*a[3]);
138TT_INLINE Quaternion operator * (
const Quaternion & a,
float scl)
143struct SlerpInfoStruct
150void Slerp_Setup(
const Quaternion & p,
const Quaternion & q,SlerpInfoStruct * slerpinfo);
151void Cached_Slerp(
const Quaternion & p,
const Quaternion & q,
float alpha,SlerpInfoStruct * slerpinfo,Quaternion * set_q);
152Quaternion Cached_Slerp(
const Quaternion & p,
const Quaternion & q,
float alpha,SlerpInfoStruct * slerpinfo);
153void __cdecl Fast_Slerp(Quaternion& result,
const Quaternion & a,
const Quaternion & b,
float t);
154Matrix3 Build_Matrix3(
const Quaternion & quat);