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);
86 r.
w = a.
w * b.
w - a.
x * b.
x - a.
y * b.
y - a.
z * b.
z;
87 r.
x = a.
w * b.
x + a.
x * b.
w + a.
y * b.
z - a.
z * b.
y;
88 r.
y = a.
w * b.
y - a.
x * b.
z + a.
y * b.
w + a.
z * b.
x;
89 r.
z = a.
w * b.
z + a.
x * b.
y - a.
y * b.
x + a.
z * b.
w;
107 return vec + 2.0 * (vec.
Cross(xyz) + a.
w * vec).Cross(xyz);
130 T l = 1.0 / sqrt(
w *
w +
x *
x +
y *
y +
z *
z);
135 template <
typename U>
139 if (m[0] + m[4] + m[8] > 0.0f) {
140 U t = m[0] + m[4] + m[8] + 1.0;
143 r.
z = (m[3] - m[1]) * s;
144 r.
y = (m[2] - m[6]) * s;
145 r.
x = (m[7] - m[5]) * s;
146 }
else if ((m[0] > m[4]) && (m[0] > m[8])) {
147 U t = m[0] - m[4] - m[8] + 1.0;
150 r.
y = (m[1] + m[3]) * s;
151 r.
z = (m[2] + m[6]) * s;
152 r.
w = (m[7] - m[5]) * s;
153 }
else if (m[4] > m[8]) {
154 U t = -m[0] + m[4] - m[8] + 1.0;
156 r.
w = (m[2] - m[6]) * s;
157 r.
x = (m[1] + m[3]) * s;
159 r.
z = (m[5] + m[7]) * s;
161 U t = -m[0] - m[4] + m[8] + 1.0;
163 r.
w = (m[3] - m[1]) * s;
164 r.
x = (m[2] + m[6]) * s;
165 r.
y = (m[7] + m[5]) * s;
171 template <
typename U>
187 m[0] = 1.0 - 2.0 * (yy + zz);
188 m[1] = 2.0 * (xy - zw);
189 m[2] = 2.0 * (xz + yw);
191 m[3] = 2.0 * (xy + zw);
192 m[4] = 1.0 - 2.0 * (xx + zz);
193 m[5] = 2.0 * (yz - xw);
195 m[6] = 2.0 * (xz - yw);
196 m[7] = 2.0 * (yz + xw);
197 m[8] = 1.0 - 2.0 * (xx + yy);
213 T cosom = a.
x * b.
x + a.
y * b.
y + a.
z * b.
z + a.
w * b.
w;
217 if (cosom < T(0.0)) {
227 if ((T(1.0) - cosom) > T(0.0001)) {
232 sclp = sin((T(1.0) - t) * omega) / sinom;
233 sclq = sin(t * omega) / sinom;
241 sclp * a.
w + sclq * end.
w,
242 sclp * a.
x + sclq * end.
x,
243 sclp * a.
y + sclq * end.
y,
244 sclp * a.
z + sclq * end.
z);
bool is_equal_exact(float a, float b)
Definition FloatComparison.h:112
Quaternion< double > Quaterniond
Definition Quaternion.h:278
Quaternion< float > Quaternionf
Definition Quaternion.h:277
Definition Quaternion.h:13
friend Quaternion operator-(const Quaternion &a, const Quaternion &b)
Definition Quaternion.h:118
Quaternion Normalized() const
Definition Quaternion.h:128
static Quaternion Slerp(const Quaternion &a, const Quaternion &b, T t)
Definition Quaternion.h:210
T y
Definition Quaternion.h:17
Quaternion(T w, T x, T y, T z)
matrix3x3< U > ToMatrix3x3() const
Definition Quaternion.h:172
friend Quaternion operator~(const Quaternion &a)
Definition Quaternion.h:74
static Quaternion Nlerp(const Quaternion &a, const Quaternion &b, T t)
Definition Quaternion.h:201
friend Quaternion operator*(const T s, const Quaternion &a)
Definition Quaternion.h:92
Quaternion(T ang, vector3< T > axis)
Definition Quaternion.h:24
friend Quaternion operator*(const Quaternion &a, const Quaternion &b)
Definition Quaternion.h:83
void GetAxisAngle(T &angle, vector3< T > &axis)
Definition Quaternion.h:48
static Quaternion FromMatrix3x3(const matrix3x3< U > &m)
Definition Quaternion.h:136
friend vector3< T > operator*(const Quaternion &a, const vector3< T > &vec)
Definition Quaternion.h:104
T x
Definition Quaternion.h:17
friend Quaternion operator*(const Quaternion &a, const T s)
Definition Quaternion.h:93
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:109
Quaternion(vector3< T > axis)
Definition Quaternion.h:35
bool ExactlyEqual(const Quaternion &a) const
Definition Quaternion.h:68
bool operator==(const Quaternion &a) const
Definition Quaternion.h:64
static T Dot(const Quaternion &a, const Quaternion &b)
Definition Quaternion.h:133
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
vector3 Cross(const vector3 &b) const
Definition vector3.h:117