29 mQuaternion{w, x, y, z}
34 mQuaternion{aData[0], aData[1], aData[2], aData[3]}
43 float p1 = mQuaternion[0] * mQuaternion[1];
44 float p2 = mQuaternion[0] * mQuaternion[2];
45 float p3 = mQuaternion[0] * mQuaternion[3];
47 float p4 = mQuaternion[1] * mQuaternion[1];
48 float p5 = mQuaternion[1] * mQuaternion[2];
49 float p6 = mQuaternion[1] * mQuaternion[3];
51 float p7 = mQuaternion[2] * mQuaternion[2];
52 float p8 = mQuaternion[2] * mQuaternion[3];
54 float p9 = mQuaternion[3] * mQuaternion[3];
59 1.0f - 2.0f * ( p7 + p9 ),
65 1.0f - 2.0f * ( p4 + p9 ),
71 1.0f - 2.0f * ( p4 + p7 ),
80 float p1 = mQuaternion[0] * mQuaternion[1];
81 float p2 = mQuaternion[0] * mQuaternion[2];
82 float p3 = mQuaternion[0] * mQuaternion[3];
84 float p4 = mQuaternion[1] * mQuaternion[1];
85 float p5 = mQuaternion[1] * mQuaternion[2];
86 float p6 = mQuaternion[1] * mQuaternion[3];
88 float p7 = mQuaternion[2] * mQuaternion[2];
89 float p8 = mQuaternion[2] * mQuaternion[3];
91 float p9 = mQuaternion[3] * mQuaternion[3];
96 1.0f - 2.0f * ( p7 + p9 ),
101 1.0f - 2.0f * ( p4 + p9 ),
106 1.0f - 2.0f * ( p4 + p7 ),
112 memcpy ( mQuaternion, aLhs,
sizeof (
float ) * 4 );
118 float local[4] { mQuaternion[0], mQuaternion[1], mQuaternion[2], mQuaternion[3] };
119 mQuaternion[0] = ( local[0] * lhs.mQuaternion[0] - local[1] * lhs.mQuaternion[1] - local[2] * lhs.mQuaternion[2] - local[3] * lhs.mQuaternion[3] );
120 mQuaternion[1] = ( local[0] * lhs.mQuaternion[1] + local[1] * lhs.mQuaternion[0] + local[2] * lhs.mQuaternion[3] - local[3] * lhs.mQuaternion[2] );
121 mQuaternion[2] = ( local[0] * lhs.mQuaternion[2] - local[1] * lhs.mQuaternion[3] + local[2] * lhs.mQuaternion[0] + local[3] * lhs.mQuaternion[1] );
122 mQuaternion[3] = ( local[0] * lhs.mQuaternion[3] + local[1] * lhs.mQuaternion[2] - local[2] * lhs.mQuaternion[1] + local[3] * lhs.mQuaternion[0] );
134 float t1 = ( -lhs[1] * rhs[0] - lhs[2] * rhs[1] - lhs[3] * rhs[2] );
135 float t2 = ( lhs[0] * rhs[0] + lhs[2] * rhs[2] - lhs[3] * rhs[1] );
136 float t3 = ( lhs[0] * rhs[1] + lhs[3] * rhs[0] - lhs[1] * rhs[2] );
137 float t4 = ( lhs[0] * rhs[2] + lhs[1] * rhs[1] - lhs[2] * rhs[0] );
140 t1 * -lhs[1] + t2 * lhs[0] + t3 * -lhs[3] - t4 * -lhs[2],
141 t1 * -lhs[2] + t3 * lhs[0] + t4 * -lhs[1] - t2 * -lhs[3],
142 t1 * -lhs[3] + t4 * lhs[0] + t2 * -lhs[2] - t3 * -lhs[1]
157 if ( interpolation <= 0.0f )
161 else if ( interpolation >= 1.0f )
167 static_cast<float> ( ( q1[0] * ( 1.0 - interpolation ) ) + ( q2[0] * interpolation ) ),
168 static_cast<float> ( ( q1[1] * ( 1.0 - interpolation ) ) + ( q2[1] * interpolation ) ),
169 static_cast<float> ( ( q1[2] * ( 1.0 - interpolation ) ) + ( q2[2] * interpolation ) ),
170 static_cast<float> ( ( q1[3] * ( 1.0 - interpolation ) ) + ( q2[3] * interpolation ) )
182 if ( interpolation <= 0.0f )
186 else if ( interpolation >= 1.0f )
190 float dot = ( q1[0] * q2[0] ) + ( q1[1] * q2[1] ) + ( q1[2] * q2[2] ) + ( q1[3] * q2[3] );
192 if ( std::fabs ( dot ) > 0.9999f )
196 else if ( dot < 0.0f )
201 float theta = acosf ( dot );
202 float sinT = 1.0f / sinf ( theta );
203 float newFactor = sinf ( interpolation * theta ) * sinT;
204 float invFactor = sinf ( ( 1.0f - interpolation ) * theta ) * sinT;
208 invFactor * q1[0] + newFactor * q2[0] * sign,
209 invFactor * q1[1] + newFactor * q2[1] * sign,
210 invFactor * q1[2] + newFactor * q2[2] * sign,
211 invFactor * q1[3] + newFactor * q2[3] * sign
218 assert ( aIndex < 4 );
219 return mQuaternion[aIndex];
224 assert ( aIndex < 4 );
225 return mQuaternion[aIndex];
230 float radians = ( angle / 180.0f ) *
static_cast<float> ( M_PI );
231 float result = sinf ( radians / 2.0f );
234 cosf ( radians / 2.0f ),
248 float length = sqrtf (
249 ( mQuaternion[0] * mQuaternion[0] ) +
250 ( mQuaternion[1] * mQuaternion[1] ) +
251 ( mQuaternion[2] * mQuaternion[2] ) +
252 ( mQuaternion[3] * mQuaternion[3] ) );
256 float oneoverlength = 1.0f / length;
257 mQuaternion[0] *= oneoverlength;
258 mQuaternion[1] *= oneoverlength;
259 mQuaternion[2] *= oneoverlength;
260 mQuaternion[3] *= oneoverlength;
267 memcpy ( aData, mQuaternion,
sizeof (
float ) * 4 );
272 double sqw = mQuaternion[0] * mQuaternion[0];
273 double sqx = mQuaternion[1] * mQuaternion[1];
274 double sqy = mQuaternion[2] * mQuaternion[2];
275 double sqz = mQuaternion[3] * mQuaternion[3];
276 double unit = sqx + sqy + sqz + sqw;
277 double test = mQuaternion[1] * mQuaternion[2] + mQuaternion[3] * mQuaternion[0];
278 if ( test > 0.499 * unit )
283 static_cast<float> ( ( 2.0 * std::atan2 ( mQuaternion[1], mQuaternion[0] ) ) * ( 180.0 / M_PI ) ),
284 static_cast<float> ( ( M_PI / 2 ) * ( 180 / M_PI ) ) );
286 if ( test < -0.499 * unit )
291 static_cast<float> ( ( -2 * std::atan2 ( mQuaternion[1], mQuaternion[0] ) ) * ( 180 / M_PI ) ),
292 static_cast<float> ( ( -M_PI / 2 ) * ( 180 / M_PI ) ) );
295 static_cast<float> ( std::atan2 ( 2 * mQuaternion[1] * mQuaternion[0] - 2 * mQuaternion[2] * mQuaternion[3], -sqx + sqy - sqz + sqw ) * ( 180 / M_PI ) ),
296 static_cast<float> ( std::atan2 ( 2 * mQuaternion[2] * mQuaternion[0] - 2 * mQuaternion[1] * mQuaternion[3], sqx - sqy - sqz + sqw ) * ( 180 / M_PI ) ),
297 static_cast<float> ( std::asin ( 2 * test / unit ) * ( 180 / M_PI ) ) );
303 double rad_pitch_over_2 = ( ( M_PI / 180 ) * aEuler[0] ) / 2;
304 double rad_roll_over_2 = ( ( M_PI / 180 ) * aEuler[1] ) / 2;
305 double rad_yaw_over_2 = ( ( M_PI / 180 ) * aEuler[2] ) / 2;
306 double c3 = std::cos ( rad_pitch_over_2 );
307 double s3 = std::sin ( rad_pitch_over_2 );
308 double c1 = std::cos ( rad_roll_over_2 );
309 double s1 = std::sin ( rad_roll_over_2 );
310 double c2 = std::cos ( rad_yaw_over_2 );
311 double s2 = std::sin ( rad_yaw_over_2 );
312 double c1c2 = c1 * c2;
313 double s1s2 = s1 * s2;
314 mQuaternion[0] =
static_cast<float> ( c1c2 * c3 - s1s2 * s3 );
315 mQuaternion[1] =
static_cast<float> ( c1c2 * s3 + s1s2 * c3 );
316 mQuaternion[2] =
static_cast<float> ( s1 * c2 * c3 + c1 * s2 * s3 );
317 mQuaternion[3] =
static_cast<float> ( c1 * s2 * c3 - s1 * c2 * s3 );
Header for 3x3 matrix class.
Header for 4x4 matrix class.
Header for the quaternion class.
Header for the 3D vector class.
3 by 3 matrix in colum mayor order.
4 by 4 matrix in colum mayor order.
DLL Quaternion & operator=(const float *aLhs)
Assign from a raw float array.
DLL Vector3 GetEuler() const
Get the Euler angle representation of this quaternion.
DLL ~Quaternion()
destructor.
static DLL const Quaternion GetFromEuler(const Vector3 &aEuler)
Create a quaternion from Euler angles.
DLL Quaternion & operator*=(const Quaternion &lhs)
Multiply this quaternion by another quaternion.
static DLL const Quaternion GetFromAxisAngle(float angle, float x, float y, float z)
Create a quaternion from an axis-angle representation.
DLL Matrix4x4 GetMatrix4x4() const
Convert the quaternion to a 4x4 rotation matrix.
DLL Matrix3x3 GetMatrix3x3() const
Convert the quaternion to a 3x3 rotation matrix.
DLL Quaternion & SetEuler(const Vector3 &aEuler)
Set the quaternion from Euler angles.
DLL Quaternion & Normalize()
Normalize this quaternion in place.
DLL void Get(float *aData) const
Copy the quaternion components to a float array.
DLL Quaternion()
Default constructor.
DLL float operator[](const size_t aIndex) const
Access a quaternion component by index (const).
<- This is here just for the literals
DLL const Matrix3x3 operator*(const Matrix3x3 &lhs, const Matrix3x3 &rhs)
Multiplies two 3x3 matrices. Multiplies two 3x3 matrices.
DLL const Quaternion NlerpQuats(const Quaternion &q1, const Quaternion &q2, double interpolation)
Linearly interpolate between two quaternions return the normalized result.
DLL const Quaternion LerpQuats(const Quaternion &q1, const Quaternion &q2, double interpolation)
Linearly interpolate between two quaternions.
DLL const Quaternion SlerpQuats(const Quaternion &q1, const Quaternion &q2, float interpolation)
Spherical Linear interpolation between two quaternions.
DLL const bool operator==(const Matrix3x3 &lhs, const Matrix3x3 &rhs)
Compare two 3x3 matrices for equality.