3 #include <Core/Math/LinearAlgebra.hpp>
4 #include <Core/RaCore.hpp>
22 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
28 inline DualQuaternion(
const Quaternion& q0,
const Quaternion& qe ) : m_q0( q0 ), m_qe( qe ) {}
40 inline const Quaternion&
getQ0()
const;
41 inline void setQ0(
const Quaternion& q0 );
42 inline const Quaternion& getQe()
const;
43 inline void setQe(
const Quaternion& qe );
68 inline Vector3
transform(
const Vector3& p )
const;
71 inline Vector3
rotate(
const Vector3& p )
const;
74 inline Vector3
translate(
const Vector3& p )
const;
90 inline void DualQuaternion::setQ0(
const Quaternion& q0 ) {
94 inline const Quaternion& DualQuaternion::getQe()
const {
98 inline void DualQuaternion::setQe(
const Quaternion& qe ) {
106 inline DualQuaternion DualQuaternion::operator*( Scalar scalar )
const {
111 *
this = *
this + other;
115 inline DualQuaternion& DualQuaternion::operator*=( Scalar scalar ) {
116 *
this = *
this * scalar;
121 const Scalar norm = m_q0.norm();
122 CORE_ASSERT( norm != 0,
"Normalizing a null quaternion." );
129 "Dual quaternion not normalized" );
135 "Dual quaternion not normalized" );
136 return m_q0.toRotationMatrix() * p;
140 Vector3 v0 = m_q0.vec();
141 Vector3 ve = m_qe.vec();
142 return p + ( ( ve * m_q0.w() - v0 * m_qe.w() + v0.cross( ve ) ) * 2_ra );
152 "Dual quaternion not normalized" );
155 result.linear() = m_q0.toRotationMatrix();
156 result.translation() = ( 2_ra * m_q0 * m_qe.conjugate() ).vec();
161 m_q0 = Quaternion( t.rotation() );
162 Core::Vector4 trans = Core::Vector4::Zero();
163 trans.head<3>() = t.translation();
164 m_qe = 0.5f * Quaternion( trans ) * m_q0;
void setFromTransform(const Transform &t)
Other methods.
EIGEN_MAKE_ALIGNED_OPERATOR_NEW DualQuaternion()
Construct an uninitialized dual quaternion.
Vector3 transform(const Vector3 &p) const
DualQuaternion(const DualQuaternion &other)=default
Default copy constructor and assignment operator.
Transform getTransform() const
Return the corresponding rigid transform. Assume a unit dual quaternion.
DualQuaternion operator+(const DualQuaternion &other) const
Operators.
Vector3 translate(const Vector3 &p) const
Apply only the translational part of the dual quaternion to the given vector.
const Quaternion & getQ0() const
Getters and setters.
Vector3 rotate(const Vector3 &p) const
Apply only the rotational part of the dual quaternion to the given vector.
DualQuaternion(const Quaternion &q0, const Quaternion &qe)
Construct a dual-quaternion from two quaternions.
std::enable_if<!std::numeric_limits< T >::is_integer, bool >::type areApproxEqual(T x, T y, T espilonBoostFactor=T(10))
Compare two numbers such that |x-y| < espilon*epsilonBoostFactor.