36 #ifndef __CU_QUATERNION_H__
37 #define __CU_QUATERNION_H__
41 #include "CUMathBase.h"
117 #pragma mark Constructors
133 this->x =
x; this->y =
y; this->z =
z; this->w =
w;
159 x = copy.
x; y = copy.
y; z = copy.
z; w = copy.
w;
169 #pragma mark Static Constructors
233 this->x =
x; this->y =
y; this->z =
z; this->w =
w;
266 x = q.
x; y = q.
y; z = q.
z; w = q.
w;
276 x = y = z = 0; w = 1;
292 #pragma mark Static Arithmetic
413 return (q1.
x * q2.
x + q1.
y * q2.
y + q1.
z * q2.
z + q1.
w * q2.
w);
418 #pragma mark Arithmetic
427 x += q.
x; y += q.
y; z += q.
z; w += q.
w;
439 x -= q.
x; y -= q.
y; z -= q.
z; w -= q.
w;
465 return *(
divide(*
this,q,
this));
477 x *= s; y *= s; z *= s; w *= s;
487 x = -
x; y = -
y; z = -
z;
515 return *(
invert(*
this,
this));
533 return *(
invert(*
this,&result));
569 x = -
x; y = -
y; z = -
z; w = -
w;
582 return *(
negate(*
this,&result));
593 return (x * q.
x + y * q.
y + z * q.
z + w * q.
w);
599 #pragma mark Operators
654 return *(
scale(*
this,1.0f/s,
this));
669 return *(
divide(*
this,q,
this));
683 return *(
add(*
this,q,&result));
697 return *(
subtract(*
this,q,&result));
709 return *(
negate(*
this,&result));
723 return *(
scale(*
this,s,&result));
739 return *(
multiply(*
this,q,&result));
753 return *(
scale(*
this,1.0f/s,&result));
771 return *(
divide(*
this,q,&result));
776 #pragma mark Comparisons
788 return x == q.
x && y == q.
y && z == q.
z && w == q.
w;
802 return x != q.
x || y != q.
y || z != q.
z || w != q.
w;
817 return (*
this-q).normSquared() < variance*variance;
821 #pragma mark Linear Attributes
846 return x*x+y*y+z*z+w*
w;
858 return x == 0.0f && y == 0.0f && z == 0.0f && w == 0.0f;
880 return x == 0.0f && y == 0.0f && z == 0.0f && w == 1.0f;
893 return equals(IDENTITY,variance);
903 bool isUnit(
float variance=CU_MATH_EPSILON)
const {
905 return fabsf(dot) <= variance;
921 #pragma mark Static Interpolation
999 #pragma mark Interpolation
1015 return *(
lerp(*
this,q,t,
this));
1037 return *(
slerp(*
this,q,t,
this));
1059 return *(
slerp(*
this,q,t,
this));
1080 return *(
lerp(*
this,q,t,&result));
1105 return *(
slerp(*
this,q,t,&result));
1130 return *(
nlerp(*
this,q,t,&result));
1143 return *(
rotate(v,*
this,&result));
1147 #pragma mark Conversion Methods
1159 std::string
toString(
bool verbose =
false)
const;
1165 operator Vec4()
const;
1200 operator Mat4()
const;
Quaternion & lerp(const Quaternion &q, float t)
Definition: CUQuaternion.h:1014
Quaternion(const Quaternion ©)
Definition: CUQuaternion.h:158
std::string toString(bool verbose=false) const
bool operator==(const Quaternion &q) const
Definition: CUQuaternion.h:787
const Quaternion operator*(const Quaternion &q) const
Definition: CUQuaternion.h:737
Quaternion getNegation() const
Definition: CUQuaternion.h:580
const Quaternion operator-() const
Definition: CUQuaternion.h:707
Quaternion getConjugate() const
Definition: CUQuaternion.h:496
Vec2 & operator*=(Vec2 &v, const Affine2 &m)
Definition: CUAffine2.h:1145
Quaternion & multiply(const Quaternion &q)
Definition: CUQuaternion.h:450
static Quaternion * subtract(const Quaternion &q1, const Quaternion &q2, Quaternion *dst)
Quaternion & set(const Quaternion &q)
Definition: CUQuaternion.h:265
Quaternion & operator*=(float s)
Definition: CUQuaternion.h:629
static Quaternion * createFromAxisAngle(const Vec3 &axis, float angle, Quaternion *dst)
float normSquared() const
Definition: CUQuaternion.h:845
static Quaternion * lerp(const Quaternion &q1, const Quaternion &q2, float t, Quaternion *dst)
static float dot(const Quaternion &q1, const Quaternion &q2)
Definition: CUQuaternion.h:412
Quaternion()
Definition: CUQuaternion.h:122
bool equals(const Quaternion &q, float variance=CU_MATH_EPSILON) const
Definition: CUQuaternion.h:816
Quaternion & operator/=(const Quaternion &q)
Definition: CUQuaternion.h:668
float dot(const Quaternion &q) const
Definition: CUQuaternion.h:592
Quaternion & subtract(const Quaternion &q)
Definition: CUQuaternion.h:438
const Quaternion operator*(float s) const
Definition: CUQuaternion.h:721
Quaternion & operator*=(const Quaternion &q)
Definition: CUQuaternion.h:642
Quaternion & negate()
Definition: CUQuaternion.h:568
float norm() const
Definition: CUQuaternion.h:829
Quaternion & set(float x, float y, float z, float w)
Definition: CUQuaternion.h:232
static Quaternion * nlerp(const Quaternion &q1, const Quaternion &q2, float t, Quaternion *dst)
bool isIdentity() const
Definition: CUQuaternion.h:879
static Vec3 * rotate(const Vec3 &v, const Quaternion &quat, Vec3 *dst)
Quaternion & slerp(const Quaternion &q, float t)
Definition: CUQuaternion.h:1036
bool isNearIdentity(float variance=CU_MATH_EPSILON) const
Definition: CUQuaternion.h:892
Quaternion & operator+=(const Quaternion &q)
Definition: CUQuaternion.h:607
Quaternion & operator=(const float *array)
Definition: CUQuaternion.h:218
bool isNearZero(float variance=CU_MATH_EPSILON) const
Definition: CUQuaternion.h:870
bool isZero() const
Definition: CUQuaternion.h:857
float x
Definition: CUQuaternion.h:102
static Quaternion * add(const Quaternion &q1, const Quaternion &q2, Quaternion *dst)
static const Quaternion IDENTITY
Definition: CUQuaternion.h:113
const Quaternion operator/(const Quaternion &q) const
Definition: CUQuaternion.h:769
Quaternion & scale(float s)
Definition: CUQuaternion.h:476
Quaternion & operator=(const Quaternion &v)
Definition: CUQuaternion.h:205
Quaternion & divide(const Quaternion &q)
Definition: CUQuaternion.h:464
float w
Definition: CUQuaternion.h:108
float y
Definition: CUQuaternion.h:104
Quaternion & normalize()
Definition: CUQuaternion.h:544
bool operator!=(const Quaternion &q) const
Definition: CUQuaternion.h:801
Quaternion getNormalization() const
Definition: CUQuaternion.h:558
const Quaternion operator+(const Quaternion &q) const
Definition: CUQuaternion.h:681
Quaternion & operator-=(const Quaternion &q)
Definition: CUQuaternion.h:618
const Quaternion operator-(const Quaternion &q) const
Definition: CUQuaternion.h:695
static const Quaternion ZERO
Definition: CUQuaternion.h:111
Quaternion & setIdentity()
Definition: CUQuaternion.h:275
Quaternion getInverse() const
Definition: CUQuaternion.h:531
bool isUnit(float variance=CU_MATH_EPSILON) const
Definition: CUQuaternion.h:903
~Quaternion()
Definition: CUQuaternion.h:165
Quaternion & conjugate()
Definition: CUQuaternion.h:486
static Quaternion * slerp(const Quaternion &q1, const Quaternion &q2, float t, Quaternion *dst)
static Quaternion * multiply(const Quaternion &q1, const Quaternion &q2, Quaternion *dst)
Quaternion(float x, float y, float z, float w)
Definition: CUQuaternion.h:132
Quaternion & operator/=(float s)
Definition: CUQuaternion.h:653
int operator*(Font::Style value)
Definition: CUFont.h:1503
Quaternion & setZero()
Definition: CUQuaternion.h:285
float toAxisAngle(Vec3 *e) const
static Quaternion * scale(const Quaternion &q1, float s, Quaternion *dst)
Quaternion getLerp(const Quaternion &q, float t)
Definition: CUQuaternion.h:1078
Quaternion getNlerp(const Quaternion &q, float t)
Definition: CUQuaternion.h:1128
const Quaternion operator/(float s) const
Definition: CUQuaternion.h:751
Vec3 getRotation(const Vec3 &v)
Definition: CUQuaternion.h:1141
Quaternion & invert()
Definition: CUQuaternion.h:514
float z
Definition: CUQuaternion.h:106
Quaternion & nlerp(const Quaternion &q, float t)
Definition: CUQuaternion.h:1058
static Quaternion * divide(const Quaternion &q1, const Quaternion &q2, Quaternion *dst)
Definition: CUAnimationNode.h:52
Definition: CUQuaternion.h:97
Quaternion & add(const Quaternion &q)
Definition: CUQuaternion.h:426
Quaternion getSlerp(const Quaternion &q, float t)
Definition: CUQuaternion.h:1103
static Quaternion * createFromRotationMatrix(const Mat4 &m, Quaternion *dst)