17 #ifndef TF_QUATERNION_H_ 18 #define TF_QUATERNION_H_ 40 : QuadWord(x, y, z, w)
55 #ifndef TF_EULER_DEFAULT_ZYX 69 setValue(axis.x() * s, axis.y() * s, axis.z() * s,
87 setValue(cosRoll * sinPitch * cosYaw + sinRoll * cosPitch * sinYaw,
88 cosRoll * cosPitch * sinYaw - sinRoll * sinPitch * cosYaw,
89 sinRoll * cosPitch * cosYaw - cosRoll * sinPitch * sinYaw,
90 cosRoll * cosPitch * cosYaw + sinRoll * sinPitch * sinYaw);
107 setValue(sinRoll * cosPitch * cosYaw - cosRoll * sinPitch * sinYaw,
108 cosRoll * sinPitch * cosYaw + sinRoll * cosPitch * sinYaw,
109 cosRoll * cosPitch * sinYaw - sinRoll * sinPitch * cosYaw,
110 cosRoll * cosPitch * cosYaw + sinRoll * sinPitch * sinYaw);
124 m_floats[0] += q.x(); m_floats[1] += q.y(); m_floats[2] += q.z(); m_floats[3] += q.m_floats[3];
132 m_floats[0] -= q.x(); m_floats[1] -= q.y(); m_floats[2] -= q.z(); m_floats[3] -= q.m_floats[3];
140 m_floats[0] *= s; m_floats[1] *= s; m_floats[2] *= s; m_floats[3] *= s;
149 setValue(m_floats[3] * q.x() + m_floats[0] * q.m_floats[3] + m_floats[1] * q.z() - m_floats[2] * q.y(),
150 m_floats[3] * q.y() + m_floats[1] * q.m_floats[3] + m_floats[2] * q.x() - m_floats[0] * q.z(),
151 m_floats[3] * q.z() + m_floats[2] * q.m_floats[3] + m_floats[0] * q.y() - m_floats[1] * q.x(),
152 m_floats[3] * q.m_floats[3] - m_floats[0] * q.x() - m_floats[1] * q.y() - m_floats[2] * q.z());
159 return m_floats[0] * q.x() + m_floats[1] * q.y() + m_floats[2] * q.z() + m_floats[3] * q.m_floats[3];
186 return Quaternion(x() * s, y() * s, z() * s, m_floats[3] * s);
255 return Vector3(m_floats[0] / s, m_floats[1] / s, m_floats[2] / s);
261 return Quaternion(-m_floats[0], -m_floats[1], -m_floats[2], m_floats[3]);
270 return Quaternion(q1.x() + q2.x(), q1.y() + q2.y(), q1.z() + q2.z(), q1.m_floats[3] + q2.m_floats[3]);
279 return Quaternion(q1.x() - q2.x(), q1.y() - q2.y(), q1.z() - q2.z(), q1.m_floats[3] - q2.m_floats[3]);
287 return Quaternion( - q2.x(), - q2.y(), - q2.z(), - q2.m_floats[3]);
295 if( diff.
dot(diff) > sum.
dot(sum) )
306 if( diff.
dot(diff) < sum.
dot(sum) )
325 return Quaternion((m_floats[0] * s0 + -q.x() * s1) * d,
326 (m_floats[1] * s0 + -q.y() * s1) * d,
327 (m_floats[2] * s0 + -q.z() * s1) * d,
328 (m_floats[3] * s0 + -q.m_floats[3] * s1) * d);
330 return Quaternion((m_floats[0] * s0 + q.x() * s1) * d,
331 (m_floats[1] * s0 + q.y() * s1) * d,
332 (m_floats[2] * s0 + q.z() * s1) * d,
333 (m_floats[3] * s0 + q.m_floats[3] * s1) * d);
358 return Quaternion(-q.x(), -q.y(), -q.z(), -q.w());
366 return Quaternion(q1.w() * q2.x() + q1.x() * q2.w() + q1.y() * q2.z() - q1.z() * q2.y(),
367 q1.w() * q2.y() + q1.y() * q2.w() + q1.z() * q2.x() - q1.x() * q2.z(),
368 q1.w() * q2.z() + q1.z() * q2.w() + q1.x() * q2.y() - q1.y() * q2.x(),
369 q1.w() * q2.w() - q1.x() * q2.x() - q1.y() * q2.y() - q1.z() * q2.z());
375 return Quaternion( q.w() * w.x() + q.y() * w.z() - q.z() * w.y(),
376 q.w() * w.y() + q.z() * w.x() - q.x() * w.z(),
377 q.w() * w.z() + q.x() * w.y() - q.y() * w.x(),
378 -q.x() * w.x() - q.y() * w.y() - q.z() * w.z());
384 return Quaternion( w.x() * q.w() + w.y() * q.z() - w.z() * q.y(),
385 w.y() * q.w() + w.z() * q.x() - w.x() * q.z(),
386 w.z() * q.w() + w.x() * q.y() - w.y() * q.x(),
387 -w.x() * q.x() - w.y() * q.y() - w.z() * q.z());
434 return q1.
slerp(q2, t);
442 return Vector3(q.getX(),q.getY(),q.getZ());
461 return Quaternion(c.getX()*rs,c.getY()*rs,c.getZ()*rs,s * 0.5f);
TFSIMD_FORCE_INLINE Quaternion nearest(const Quaternion &qd) const
Quaternion inverse() const
Return the inverse of this quaternion.
tfScalar getAngleShortestPath() const
Return the angle [0, Pi] of rotation represented by this quaternion along the shortest path...
The Quaternion implements quaternion to perform linear algebra rotations in combination with Matrix3x...
TFSIMD_FORCE_INLINE Quaternion operator-() const
Return the negative of this quaternion This simply negates each element.
TFSIMD_FORCE_INLINE Quaternion operator-(const Quaternion &q2) const
Return the difference between this quaternion and the other.
double tfScalar
The tfScalar type abstracts floating point numbers, to easily switch between double and single floati...
Quaternion operator/(const tfScalar &s) const
Return an inversely scaled versionof this quaternion.
ROS_DEPRECATED Quaternion(const tfScalar &yaw, const tfScalar &pitch, const tfScalar &roll)
Constructor from Euler angles.
Quaternion & operator/=(const tfScalar &s)
Inversely scale this quaternion.
Quaternion(const Vector3 &axis, const tfScalar &angle)
Axis angle Constructor.
tfScalar angle(const Quaternion &q) const
Return the half angle between this quaternion and the other.
Quaternion & normalize()
Normalize the quaternion Such that x^2 + y^2 + z^2 +w^2 = 1.
tfScalar dot(const Quaternion &q) const
Return the dot product between this quaternion and another.
Quaternion & operator*=(const tfScalar &s)
Scale this quaternion.
Quaternion & operator*=(const Quaternion &q)
Multiply this quaternion by q on the right.
ROS_DEPRECATED void setEulerZYX(const tfScalar &yaw, const tfScalar &pitch, const tfScalar &roll)
Set the quaternion using euler angles.
Vector3 getAxis() const
Return the axis of the rotation represented by this quaternion.
TFSIMD_FORCE_INLINE void tfPlaneSpace1(const Vector3 &n, Vector3 &p, Vector3 &q)
TFSIMD_FORCE_INLINE tfScalar tfCos(tfScalar x)
TFSIMD_FORCE_INLINE const tfScalar & getW() const
TFSIMD_FORCE_INLINE Quaternion farthest(const Quaternion &qd) const
TFSIMD_FORCE_INLINE tfScalar tfAcos(tfScalar x)
void setRPY(const tfScalar &roll, const tfScalar &pitch, const tfScalar &yaw)
Set the quaternion using fixed axis RPY.
static const Quaternion & getIdentity()
Quaternion slerp(const Quaternion &q, const tfScalar &t) const
Return the quaternion which is the result of Spherical Linear Interpolation between this and the othe...
tfScalar length() const
Return the length of the quaternion.
TFSIMD_FORCE_INLINE Vector3 quatRotate(const Quaternion &rotation, const Vector3 &v)
#define TFSIMD_FORCE_INLINE
tfScalar length2() const
Return the length squared of the quaternion.
void setEuler(const tfScalar &yaw, const tfScalar &pitch, const tfScalar &roll)
Set the quaternion using Euler angles.
TFSIMD_FORCE_INLINE Quaternion operator+(const Quaternion &q2) const
Return the sum of this quaternion and the other.
Quaternion()
No initialization constructor.
TFSIMD_FORCE_INLINE tfScalar tfSqrt(tfScalar x)
Quaternion(const tfScalar &x, const tfScalar &y, const tfScalar &z, const tfScalar &w)
Constructor from scalars.
TFSIMD_FORCE_INLINE Quaternion shortestArcQuatNormalize2(Vector3 &v0, Vector3 &v1)
Quaternion & operator-=(const Quaternion &q)
Sutfract out a quaternion.
TFSIMD_FORCE_INLINE Quaternion & operator+=(const Quaternion &q)
Add two quaternions.
Vector3 can be used to represent 3D points and vectors. It has an un-used w component to suit 16-byte...
tfScalar getAngle() const
Return the angle [0, 2Pi] of rotation represented by this quaternion.
TFSIMD_FORCE_INLINE tfScalar tfSin(tfScalar x)
TFSIMD_FORCE_INLINE Quaternion shortestArcQuat(const Vector3 &v0, const Vector3 &v1)
TFSIMD_FORCE_INLINE Quaternion operator*(const tfScalar &s) const
Return a scaled version of this quaternion.
tfScalar angleShortestPath(const Quaternion &q) const
Return the angle between this quaternion and the other along the shortest path.
void setRotation(const Vector3 &axis, const tfScalar &angle)
Set the rotation using axis angle notation.
TFSIMD_FORCE_INLINE tfScalar tfPow(tfScalar x, tfScalar y)
Quaternion normalized() const
Return a normalized version of this quaternion.