18 #include "precompiled.h"
120 (*this) = QYaw * QPitch * QRoll;
124 float heading, attitude, bank;
129 float unit = sqx + sqy + sqz + sqw;
133 heading = 2 * atan2(
m_V.
X, m_W);
134 attitude = (float)
M_PI/2;
137 else if (test < (-.5f+
EPSILON)*unit)
139 heading = -2 * atan2(
m_V.
X, m_W);
140 attitude = -(float)
M_PI/2;
145 heading = atan2(2.f * (
m_V.
X*
m_V.
Y +
m_V.
Z*m_W),(sqx - sqy - sqz + sqw));
146 bank = atan2(2.f * (
m_V.
Y*
m_V.
Z +
m_V.
X*m_W),(-sqx - sqy + sqz + sqw));
149 return CVector3D(bank, attitude, heading);
161 float wx, wy, wz, xx, xy, xz, yy, yz, zz;
177 result.
_11 = 1.0f - (yy + zz);
178 result.
_12 = xy - wz;
179 result.
_13 = xz + wy;
182 result.
_21 = xy + wz;
183 result.
_22 = 1.0f - (xx + zz);
184 result.
_23 = yz - wx;
187 result.
_31 = xz - wy;
188 result.
_32 = yz + wx;
189 result.
_33 = 1.0f - (xx + yy);
201 float omega, cosom, sinom, scale0, scale1;
204 cosom = from.
Dot(to);
228 omega = acosf(cosom);
230 scale0 = sinf((1.0f - ratio) * omega) / sinom;
231 scale1 = sinf(ratio * omega) / sinom;
237 scale0 = 1.0f - ratio;
242 m_V.
X = scale0 * from.
m_V.
X + scale1 * to1[0];
243 m_V.
Y = scale0 * from.
m_V.
Y + scale1 * to1[1];
244 m_V.
Z = scale0 * from.
m_V.
Z + scale1 * to1[2];
245 m_W = scale0 * from.
m_W + scale1 * to1[3];
250 float c = from.
Dot(to);
252 *
this = from - (to + from) * ratio;
254 *
this = from + (to - from) * ratio;
262 float sinHalfTheta=(float) sin(angle/2);
263 float cosHalfTheta=(float) cos(angle/2);
265 m_V.
X=axis.
X*sinHalfTheta;
266 m_V.
Y=axis.
Y*sinHalfTheta;
267 m_V.
Z=axis.
Z*sinHalfTheta;
277 angle = acosf(q.
m_W) * 2.f;
278 float sin_a = sqrtf(1.f - q.
m_W * q.
m_W);
279 if (fabsf(sin_a) < 0.0005f) sin_a = 1.f;
280 axis.
X = q.
m_V.
X / sin_a;
281 axis.
Y = q.
m_V.
Y / sin_a;
282 axis.
Z = q.
m_V.
Z / sin_a;
292 float invlen=1.0f/sqrtf(lensqrd);
void FromEulerAngles(float x, float y, float z)
CQuaternion GetInverse() const
CQuaternion operator*(const CQuaternion &quat) const
CQuaternion & operator*=(const CQuaternion &quat)
float Dot(const CVector3D &vector) const
CVector3D Cross(const CVector3D &vector) const
CVector3D Rotate(const CVector3D &vec) const
CQuaternion & operator-=(const CQuaternion &quat)
CVector3D ToEulerAngles()
CQuaternion operator+(const CQuaternion &quat) const
void ToAxisAngle(CVector3D &axis, float &angle)
CMatrix3D ToMatrix() const
float Dot(const CQuaternion &quat) const
CQuaternion & operator+=(const CQuaternion &quat)
CQuaternion operator-(const CQuaternion &quat) const
void FromAxisAngle(const CVector3D &axis, float angle)
void Nlerp(const CQuaternion &from, const CQuaternion &to, float ratio)
void Slerp(const CQuaternion &from, const CQuaternion &to, float ratio)