9 #include "../Common/MathUtil.hpp" 10 #include "../Common/Traits.hpp" 11 #include "../Matrix.hpp" 12 #include "../Utility.hpp" 13 #include "../Vector.hpp" 30 template <
class T,
bool Packed = false>
64 template <
class U,
bool P>
69 template <
class U, eMatrixOrder Order, eMatrixLayout Layout,
bool PackedA>
75 template <
class U, eMatrixLayout Layout,
bool PackedA>
81 template <
class U, eMatrixLayout Layout,
bool PackedA>
87 template <
class U, eMatrixOrder Order, eMatrixLayout Layout,
bool PackedA>
103 template <
class U,
bool P>
112 template <
class U, eMatrixOrder Order, eMatrixLayout Layout,
bool PackedA>
119 template <
class U, eMatrixLayout Layout,
bool PackedA>
126 template <
class U, eMatrixLayout Layout,
bool PackedA>
133 template <
class U, eMatrixOrder Order, eMatrixLayout Layout,
bool PackedA>
169 template <
class U, eMatrixOrder Order, eMatrixLayout Layout,
bool PackedA>
171 return ToMatrix<U, 3, 3, Order, Layout, PackedA>();
174 template <
class U, eMatrixLayout Layout,
bool PackedA>
176 return ToMatrix<U, 3, 4, eMatrixOrder::PRECEDE_VECTOR, Layout, PackedA>();
179 template <
class U, eMatrixLayout Layout,
bool PackedA>
181 return ToMatrix<U, 4, 3, eMatrixOrder::FOLLOW_VECTOR, Layout, PackedA>();
184 template <
class U, eMatrixOrder Order, eMatrixLayout Layout,
bool PackedA>
186 return ToMatrix<U, 4, 4, Order, Layout, PackedA>();
194 template <
class U,
bool PackedA>
203 template <
class U,
int Rows,
int Columns, eMatrixOrder Order, eMatrixLayout Layout,
bool PackedA>
207 auto elem = [&mat](
int i,
int j) -> U& {
210 elem(0, 0) = 1 - 2 * (
j *
j +
k *
k);
211 elem(0, 1) = 2 * (i *
j -
k *
s);
212 elem(0, 2) = 2 * (i *
k +
j *
s);
213 elem(1, 0) = 2 * (i *
j +
k *
s);
214 elem(1, 1) = 1 - 2 * (i * i +
k *
k);
215 elem(1, 2) = 2 * (
j *
k - i *
s);
216 elem(2, 0) = 2 * (i *
k -
j *
s);
217 elem(2, 1) = 2 * (
j *
k + i *
s);
218 elem(2, 2) = 1 - 2 * (i * i +
j *
j);
221 for (
int j = 0;
j < mat.
Width(); ++
j) {
222 for (
int i = (
j < 3 ? 3 : 0); i < mat.
Height(); ++
i) {
223 mat(i,
j) = T(
j == i);
230 template <
class U,
int Rows,
int Columns, eMatrixOrder Order, eMatrixLayout Layout,
bool PackedA>
233 auto elem = [&mat](
int i,
int j) -> U {
236 w = std::sqrt(1 + elem(0, 0) + elem(1, 1) + elem(2, 2)) * T(0.5);
237 T div = T(1) / (T(4) *
w);
238 x = (elem(2, 1) - elem(1, 2)) * div;
239 y = (elem(0, 2) - elem(2, 0)) * div;
240 z = (elem(1, 0) - elem(0, 1)) * div;
Quaternion & operator=(const Matrix< U, 3, 4, eMatrixOrder::PRECEDE_VECTOR, Layout, PackedA > &rhs)
Convert a rotation matrix to equivalent quaternion.
Definition: QuaternionImpl.hpp:120
static constexpr bool SimdAccelerated
Definition: QuaternionImpl.hpp:33
bool IsRotationMatrix3D(const Matrix< T, Rows, Columns, Order, Layout, Packed > &m)
Determines if the matrix is a proper rotation matrix.
Definition: Rotation3DBuilder.hpp:340
Quaternion(const Vector< T, 4, false > &vec)
Definition: QuaternionImpl.hpp:92
Quaternion(const Quaternion &rhs)
Definition: QuaternionImpl.hpp:50
Allows you to do quaternion math and represent rotation in a compact way.
Definition: Definitions.hpp:69
T x
Definition: QuaternionImpl.hpp:39
Quaternion(const Quaternion< U, P > &rhs)
Definition: QuaternionImpl.hpp:65
Quaternion()
Does NOT zero-initialize values.
Definition: QuaternionImpl.hpp:48
Quaternion(const Matrix< U, 4, 4, Order, Layout, PackedA > &rhs)
Convert a rotation matrix to equivalent quaternion.
Definition: QuaternionImpl.hpp:88
T j
Definition: QuaternionImpl.hpp:36
Quaternion & operator=(const Matrix< U, 4, 4, Order, Layout, PackedA > &rhs)
Convert a rotation matrix to equivalent quaternion.
Definition: QuaternionImpl.hpp:134
T k
Definition: QuaternionImpl.hpp:36
T sign_nonzero(T arg)
Definition: MathUtil.hpp:11
Quaternion(const Matrix< U, 3, 4, eMatrixOrder::PRECEDE_VECTOR, Layout, PackedA > &rhs)
Convert a rotation matrix to equivalent quaternion.
Definition: QuaternionImpl.hpp:76
Quaternion(T scalar, const Vector< T, 3, false > &vector)
Sets the scalar part (w) and the vector part (xyz). This is not AxisAngle rotation.
Definition: QuaternionImpl.hpp:59
const T ScalarPart() const
Returns the scalar part (w) of (w + xi + yj + zk).
Definition: QuaternionImpl.hpp:144
Definition: Approx.hpp:11
const Vector< T, 3, Packed > VectorPart() const
Returns the vector part (x, y, z) of (w + xi + yj + zk).
Definition: QuaternionImpl.hpp:148
Quaternion(const Matrix< U, 4, 3, eMatrixOrder::FOLLOW_VECTOR, Layout, PackedA > &rhs)
Convert a rotation matrix to equivalent quaternion.
Definition: QuaternionImpl.hpp:82
Quaternion & operator=(const Matrix< U, 3, 3, Order, Layout, PackedA > &rhs)
Convert a rotation matrix to equivalent quaternion.
Definition: QuaternionImpl.hpp:113
Quaternion & operator=(const Quaternion &rhs)
Definition: QuaternionImpl.hpp:97
constexpr int Height() const
Returns the number of rows of the matrix.
Definition: MatrixImpl.hpp:39
T z
Definition: QuaternionImpl.hpp:39
const T Angle() const
Returns the angle of the rotation represented by quaternion.
Definition: QuaternionImpl.hpp:154
Definition: Definitions.hpp:63
constexpr int Width() const
Returns the number of columns of the matrix.
Definition: MatrixImpl.hpp:35
Quaternion & operator=(const Quaternion< U, P > &rhs)
Convert from quaternion with different base type and packing.
Definition: QuaternionImpl.hpp:104
Quaternion & operator=(const Matrix< U, 4, 3, eMatrixOrder::FOLLOW_VECTOR, Layout, PackedA > &rhs)
Convert a rotation matrix to equivalent quaternion.
Definition: QuaternionImpl.hpp:127
const Vector< T, 3, Packed > Axis() const
Returns the axis of rotation represented by quaternion.
Definition: QuaternionImpl.hpp:159
Quaternion(const Vector< T, 3, true > &vector)
Sets the scalar part to zero, and the vector part to given argument.
Definition: QuaternionImpl.hpp:62
T i
Definition: QuaternionImpl.hpp:36
Quaternion(const Matrix< U, 3, 3, Order, Layout, PackedA > &rhs)
Convert a rotation matrix to equivalent quaternion.
Definition: QuaternionImpl.hpp:70
Vector< T, 4, Packed > vec
Definition: QuaternionImpl.hpp:41
Quaternion(T scalar, const Vector< T, 3, true > &vector)
Sets the scalar part (w) and the vector part (xyz). This is not AxisAngle rotation.
Definition: QuaternionImpl.hpp:56
T y
Definition: QuaternionImpl.hpp:39
Definition: Traits.hpp:218
T Length(const Quaternion< T, Packed > &q)
Returns the absolute value of the quaternion.
Definition: QuaternionFunction.hpp:60
T w
Definition: QuaternionImpl.hpp:39
Quaternion(T scalar, T x, T y, T z)
Set values directly.
Definition: QuaternionImpl.hpp:53
T s
Definition: QuaternionImpl.hpp:36
Vector< T, Dim, Packed > SafeNormalize(const Vector< T, Dim, Packed > &v)
Makes a unit vector, but keeps direction. Leans towards (1,0,0...) for nullvectors, costs more.
Definition: VectorFunction.hpp:76
bool IsNormalized(const Quaternion< T, Packed > &q)
Check if the quaternion is a unit quaternion, with some tolerance for floats.
Definition: QuaternionFunction.hpp:78