10 #include <type_traits>
14 using other_float_t =
typename std::conditional<std::is_same<T, float>::value, double,
float>::type;
26 const T halfAng = ang * T(0.5);
27 const T sinHalfAng = sin(halfAng);
29 x = axis.
x * sinHalfAng;
30 y = axis.
y * sinHalfAng;
31 z = axis.
z * sinHalfAng;
51 angle = 2.0 * acos(
w);
52 double s = sqrt(1.0 -
w *
w);
77 r.
w = a.
w * b.
w - a.
x * b.
x - a.
y * b.
y - a.
z * b.
z;
78 r.
x = a.
w * b.
x + a.
x * b.
w + a.
y * b.
z - a.
z * b.
y;
79 r.
y = a.
w * b.
y - a.
x * b.
z + a.
y * b.
w + a.
z * b.
x;
80 r.
z = a.
w * b.
z + a.
x * b.
y - a.
y * b.
x + a.
z * b.
w;
114 T l = 1.0 / sqrt(
w *
w +
x *
x +
y *
y +
z *
z);
119 template <
typename U>
123 if (m[0] + m[4] + m[8] > 0.0f) {
124 U t = m[0] + m[4] + m[8] + 1.0;
127 r.
z = (m[3] - m[1]) * s;
128 r.
y = (m[2] - m[6]) * s;
129 r.
x = (m[7] - m[5]) * s;
130 }
else if ((m[0] > m[4]) && (m[0] > m[8])) {
131 U t = m[0] - m[4] - m[8] + 1.0;
134 r.
y = (m[1] + m[3]) * s;
135 r.
z = (m[2] + m[6]) * s;
136 r.
w = (m[7] - m[5]) * s;
137 }
else if (m[4] > m[8]) {
138 U t = -m[0] + m[4] - m[8] + 1.0;
140 r.
w = (m[2] - m[6]) * s;
141 r.
x = (m[1] + m[3]) * s;
143 r.
z = (m[5] + m[7]) * s;
145 U t = -m[0] - m[4] + m[8] + 1.0;
147 r.
w = (m[3] - m[1]) * s;
148 r.
x = (m[2] + m[6]) * s;
149 r.
y = (m[7] + m[5]) * s;
155 template <
typename U>
171 m[0] = 1.0 - 2.0 * (yy + zz);
172 m[1] = 2.0 * (xy - zw);
173 m[2] = 2.0 * (xz + yw);
175 m[3] = 2.0 * (xy + zw);
176 m[4] = 1.0 - 2.0 * (xx + zz);
177 m[5] = 2.0 * (yz - xw);
179 m[6] = 2.0 * (xz - yw);
180 m[7] = 2.0 * (yz + xw);
181 m[8] = 1.0 - 2.0 * (xx + yy);
197 T cosom = a.
x * b.
x + a.
y * b.
y + a.
z * b.
z + a.
w * b.
w;
201 if (cosom < T(0.0)) {
211 if ((T(1.0) - cosom) > T(0.0001)) {
216 sclp = sin((T(1.0) - t) * omega) / sinom;
217 sclq = sin(t * omega) / sinom;
225 sclp * a.
w + sclq * end.
w,
226 sclp * a.
x + sclq * end.
x,
227 sclp * a.
y + sclq * end.
y,
228 sclp * a.
z + sclq * end.
z);
Quaternion< double > Quaterniond
Definition: Quaternion.h:254
Quaternion< float > Quaternionf
Definition: Quaternion.h:253
Definition: Quaternion.h:13
friend Quaternion operator-(const Quaternion &a, const Quaternion &b)
Definition: Quaternion.h:102
Quaternion Normalized() const
Definition: Quaternion.h:112
static Quaternion Slerp(const Quaternion &a, const Quaternion &b, T t)
Definition: Quaternion.h:194
T y
Definition: Quaternion.h:17
Quaternion(T w, T x, T y, T z)
friend Quaternion operator~(const Quaternion &a)
Definition: Quaternion.h:65
static Quaternion Nlerp(const Quaternion &a, const Quaternion &b, T t)
Definition: Quaternion.h:185
friend Quaternion operator*(const T s, const Quaternion &a)
Definition: Quaternion.h:83
Quaternion(T ang, vector3< T > axis)
Definition: Quaternion.h:24
friend Quaternion operator*(const Quaternion &a, const Quaternion &b)
Definition: Quaternion.h:74
void GetAxisAngle(T &angle, vector3< T > &axis)
Definition: Quaternion.h:48
static Quaternion FromMatrix3x3(const matrix3x3< U > &m)
Definition: Quaternion.h:120
matrix3x3< U > ToMatrix3x3() const
Definition: Quaternion.h:156
T x
Definition: Quaternion.h:17
friend Quaternion operator*(const Quaternion &a, const T s)
Definition: Quaternion.h:84
T w
Definition: Quaternion.h:17
Quaternion(const Quaternion< other_float_t > &o)
Definition: Quaternion.h:42
friend Quaternion operator+(const Quaternion &a, const Quaternion &b)
Definition: Quaternion.h:93
Quaternion(vector3< T > axis)
Definition: Quaternion.h:35
static T Dot(const Quaternion &a, const Quaternion &b)
Definition: Quaternion.h:117
T z
Definition: Quaternion.h:17
Definition: matrix3x3.h:13
T y
Definition: vector3.h:18
T x
Definition: vector3.h:18
T z
Definition: vector3.h:18