11 float x, y, z, w; // w + xi + yj + zk
13 static Quaternion identity;
15 Quaternion() : x(0), y(0), z(0), w(1) {}
16 Quaternion(float x_, float y_, float z_, float w_) : x(x_), y(y_), z(z_), w(w_) {}
17 Quaternion(const Vector3 &v, float s) : x(v.x), y(v.y), z(v.z), w(s) {}
19 inline void normalize();
20 inline void conjugate();
23 inline void set_rotation(const Vector3 &axis, float angle);
24 inline void rotate(const Vector3 &axis, float angle);
25 // rotate by a quaternion rq by doing: rq * *this * conjugate(rq)
26 inline void rotate(const Quaternion &rq);
28 inline Matrix4x4 calc_matrix() const;
31 inline Quaternion operator -(const Quaternion &q);
32 inline Quaternion operator +(const Quaternion &a, const Quaternion &b);
33 inline Quaternion operator -(const Quaternion &a, const Quaternion &b);
34 inline Quaternion operator *(const Quaternion &a, const Quaternion &b);
36 inline Quaternion &operator +=(Quaternion &a, const Quaternion &b);
37 inline Quaternion &operator -=(Quaternion &a, const Quaternion &b);
38 inline Quaternion &operator *=(Quaternion &a, const Quaternion &b);
40 inline float length(const Quaternion &q);
41 inline float length_sq(const Quaternion &q);
43 inline Quaternion normalize(const Quaternion &q);
44 inline Quaternion conjugate(const Quaternion &q);
45 inline Quaternion inverse(const Quaternion &q);
47 Quaternion slerp(const Quaternion &a, const Quaternion &b, float t);
48 inline Quaternion lerp(const Quaternion &a, const Quaternion &b, float t);
54 #endif // QUATERNION_H_