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;
155 #pragma mark Static Constructors
208 this->x =
x; this->y =
y; this->z =
z; this->w =
w;
241 x = q.
x; y = q.
y; z = q.
z; w = q.
w;
251 x = y = z = 0; w = 1;
267 #pragma mark Static Arithmetic
388 return (q1.
x * q2.
x + q1.
y * q2.
y + q1.
z * q2.
z + q1.
w * q2.
w);
393 #pragma mark Arithmetic
402 x += q.
x; y += q.
y; z += q.
z; w += q.
w;
414 x -= q.
x; y -= q.
y; z -= q.
z; w -= q.
w;
440 return *(
divide(*
this,q,
this));
452 x *= s; y *= s; z *= s; w *= s;
462 x = -
x; y = -
y; z = -
z;
490 return *(
invert(*
this,
this));
508 return *(
invert(*
this,&result));
544 x = -
x; y = -
y; z = -
z; w = -
w;
557 return *(
negate(*
this,&result));
568 return (x * q.
x + y * q.
y + z * q.
z + w * q.
w);
574 #pragma mark Operators
629 return *(
scale(*
this,1.0f/s,
this));
644 return *(
divide(*
this,q,
this));
658 return *(
add(*
this,q,&result));
672 return *(
subtract(*
this,q,&result));
684 return *(
negate(*
this,&result));
698 return *(
scale(*
this,s,&result));
714 return *(
multiply(*
this,q,&result));
728 return *(
scale(*
this,1.0f/s,&result));
746 return *(
divide(*
this,q,&result));
751 #pragma mark Comparisons
763 return x == q.
x && y == q.
y && z == q.
z && w == q.
w;
777 return x != q.
x || y != q.
y || z != q.
z || w != q.
w;
792 return (*
this-q).normSquared() < variance*variance;
796 #pragma mark Linear Attributes
821 return x*x+y*y+z*z+w*
w;
833 return x == 0.0f && y == 0.0f && z == 0.0f && w == 0.0f;
855 return x == 0.0f && y == 0.0f && z == 0.0f && w == 1.0f;
868 return equals(IDENTITY,variance);
878 bool isUnit(
float variance=CU_MATH_EPSILON)
const {
880 return fabsf(dot) <= variance;
896 #pragma mark Static Interpolation
974 #pragma mark Interpolation
990 return *(
lerp(*
this,q,t,
this));
1012 return *(
slerp(*
this,q,t,
this));
1034 return *(
slerp(*
this,q,t,
this));
1055 return *(
lerp(*
this,q,t,&result));
1080 return *(
slerp(*
this,q,t,&result));
1105 return *(
nlerp(*
this,q,t,&result));
1118 return *(
rotate(v,*
this,&result));
1122 #pragma mark Conversion Methods
1134 std::string
toString(
bool verbose =
false)
const;
1140 operator Vec4()
const;
1175 operator Mat4()
const;
Quaternion & lerp(const Quaternion &q, float t)
Definition: CUQuaternion.h:989
std::string toString(bool verbose=false) const
bool operator==(const Quaternion &q) const
Definition: CUQuaternion.h:762
const Quaternion operator*(const Quaternion &q) const
Definition: CUQuaternion.h:712
Quaternion getNegation() const
Definition: CUQuaternion.h:555
const Quaternion operator-() const
Definition: CUQuaternion.h:682
Quaternion getConjugate() const
Definition: CUQuaternion.h:471
Vec2 & operator*=(Vec2 &v, const Affine2 &m)
Definition: CUAffine2.h:1165
Quaternion & multiply(const Quaternion &q)
Definition: CUQuaternion.h:425
static Quaternion * subtract(const Quaternion &q1, const Quaternion &q2, Quaternion *dst)
Quaternion & set(const Quaternion &q)
Definition: CUQuaternion.h:240
Quaternion & operator*=(float s)
Definition: CUQuaternion.h:604
static Quaternion * createFromAxisAngle(const Vec3 &axis, float angle, Quaternion *dst)
float normSquared() const
Definition: CUQuaternion.h:820
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:387
Quaternion()
Definition: CUQuaternion.h:122
bool equals(const Quaternion &q, float variance=CU_MATH_EPSILON) const
Definition: CUQuaternion.h:791
Quaternion & operator/=(const Quaternion &q)
Definition: CUQuaternion.h:643
float dot(const Quaternion &q) const
Definition: CUQuaternion.h:567
Quaternion & subtract(const Quaternion &q)
Definition: CUQuaternion.h:413
const Quaternion operator*(float s) const
Definition: CUQuaternion.h:696
Quaternion & operator*=(const Quaternion &q)
Definition: CUQuaternion.h:617
Quaternion & negate()
Definition: CUQuaternion.h:543
float norm() const
Definition: CUQuaternion.h:804
Quaternion & set(float x, float y, float z, float w)
Definition: CUQuaternion.h:207
static Quaternion * nlerp(const Quaternion &q1, const Quaternion &q2, float t, Quaternion *dst)
bool isIdentity() const
Definition: CUQuaternion.h:854
static Vec3 * rotate(const Vec3 &v, const Quaternion &quat, Vec3 *dst)
Quaternion & slerp(const Quaternion &q, float t)
Definition: CUQuaternion.h:1011
bool isNearIdentity(float variance=CU_MATH_EPSILON) const
Definition: CUQuaternion.h:867
Quaternion & operator+=(const Quaternion &q)
Definition: CUQuaternion.h:582
Quaternion & operator=(const float *array)
Definition: CUQuaternion.h:193
bool isNearZero(float variance=CU_MATH_EPSILON) const
Definition: CUQuaternion.h:845
bool isZero() const
Definition: CUQuaternion.h:832
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:744
Quaternion & scale(float s)
Definition: CUQuaternion.h:451
Quaternion & divide(const Quaternion &q)
Definition: CUQuaternion.h:439
float w
Definition: CUQuaternion.h:108
float y
Definition: CUQuaternion.h:104
Quaternion & normalize()
Definition: CUQuaternion.h:519
bool operator!=(const Quaternion &q) const
Definition: CUQuaternion.h:776
Quaternion getNormalization() const
Definition: CUQuaternion.h:533
const Quaternion operator+(const Quaternion &q) const
Definition: CUQuaternion.h:656
Quaternion & operator-=(const Quaternion &q)
Definition: CUQuaternion.h:593
const Quaternion operator-(const Quaternion &q) const
Definition: CUQuaternion.h:670
static const Quaternion ZERO
Definition: CUQuaternion.h:111
Quaternion & setIdentity()
Definition: CUQuaternion.h:250
Quaternion getInverse() const
Definition: CUQuaternion.h:506
bool isUnit(float variance=CU_MATH_EPSILON) const
Definition: CUQuaternion.h:878
Quaternion & conjugate()
Definition: CUQuaternion.h:461
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:628
int operator*(Font::Style value)
Definition: CUFont.h:1503
Quaternion & setZero()
Definition: CUQuaternion.h:260
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:1053
Quaternion getNlerp(const Quaternion &q, float t)
Definition: CUQuaternion.h:1103
const Quaternion operator/(float s) const
Definition: CUQuaternion.h:726
Vec3 getRotation(const Vec3 &v)
Definition: CUQuaternion.h:1116
Quaternion & invert()
Definition: CUQuaternion.h:489
float z
Definition: CUQuaternion.h:106
Quaternion & nlerp(const Quaternion &q, float t)
Definition: CUQuaternion.h:1033
static Quaternion * divide(const Quaternion &q1, const Quaternion &q2, Quaternion *dst)
Definition: CUAction.h:51
Definition: CUQuaternion.h:97
Quaternion & add(const Quaternion &q)
Definition: CUQuaternion.h:401
Quaternion getSlerp(const Quaternion &q, float t)
Definition: CUQuaternion.h:1078
static Quaternion * createFromRotationMatrix(const Mat4 &m, Quaternion *dst)