19#ifndef AGX_QUATTEMPLATE_H
20#define AGX_QUATTEMPLATE_H
31# pragma warning(disable: 6385)
41 class AffineMatrix4x4T;
96 template <
typename T2>
407 template <
typename T>
416 template <
typename T>
425 template <
typename T>
434 template <
typename T>
437 setRotate( angle, axis );
440 template <
typename T>
445 setRotate( angle1, axis1, angle2, axis2, angle3, axis3 );
448 template <
typename T>
451 setRotate( from, to );
455 template <
typename T>
456 template <
typename T2>
459 m_data[ 0 ] = (T)copy[ 0 ];
460 m_data[ 1 ] = (T)copy[ 1 ];
461 m_data[ 2 ] = (T)copy[ 2 ];
462 m_data[ 3 ] = (T)copy[ 3 ];
465 template <
typename T>
472 template <
typename T>
482 template <
typename T>
485 return m_data[0] == v.
m_data[0] && m_data[1] == v.
m_data[1] && m_data[2] == v.
m_data[2] && m_data[3] == v.
m_data[3];
488 template <
typename T>
491 return m_data[0] != v.
m_data[0] || m_data[1] != v.
m_data[1] || m_data[2] != v.
m_data[2] || m_data[3] != v.
m_data[3];
494 template <
typename T>
497 return Vec4T<T>( m_data[0], m_data[1], m_data[2], m_data[3] );
500 template <
typename T>
503 return Vec3T<T>( m_data[0], m_data[1], m_data[2] );
506 template <
typename T>
515 template <
typename T>
524 template <
typename T>
531 template <
typename T>
538 template <
typename T>
544 template <
typename T>
550 template <
typename T>
556 template <
typename T>
562 template <
typename T>
568 template <
typename T>
574 template <
typename T>
580 template <
typename T>
586 template <
typename T>
589 return m_data[0] == 0.0 && m_data[1] == 0.0 && m_data[2] == 0.0 && m_data[3] == 1.0;
593 template <
typename T>
596 return QuatT( m_data[0] * rhs, m_data[1] * rhs, m_data[2] * rhs, m_data[3] * rhs );
599 template <
typename T>
609 template <
typename T>
618 template <
typename T>
621 T x = rhs.
m_data[3] * m_data[0] + rhs.
m_data[0] * m_data[3] + rhs.
m_data[1] * m_data[2] - rhs.
m_data[2] * m_data[1];
622 T y = rhs.
m_data[3] * m_data[1] - rhs.
m_data[0] * m_data[2] + rhs.
m_data[1] * m_data[3] + rhs.
m_data[2] * m_data[0];
623 T z = rhs.
m_data[3] * m_data[2] + rhs.
m_data[0] * m_data[1] - rhs.
m_data[1] * m_data[0] + rhs.
m_data[2] * m_data[3];
624 m_data[3] = rhs.
m_data[3] * m_data[3] - rhs.
m_data[0] * m_data[0] - rhs.
m_data[1] * m_data[1] - rhs.
m_data[2] * m_data[2];
633 template <
typename T>
636 return (*
this) * rhs ;
639 template <
typename T>
642 return rhs * (*this) ;
646 template <
typename T>
650 return QuatT( m_data[0] * div, m_data[1] * div, m_data[2] * div, m_data[3] * div );
653 template <
typename T>
664 template <
typename T>
667 return ( ( *
this ) * denom.
inverse() );
670 template <
typename T>
673 ( *this ) = ( *this ) * denom.
inverse();
677 template <
typename T>
684 template <
typename T>
687 m_data[0] += rhs.
m_data[0];
688 m_data[1] += rhs.
m_data[1];
689 m_data[2] += rhs.
m_data[2];
690 m_data[3] += rhs.
m_data[3];
694 template <
typename T>
701 template <
typename T>
704 m_data[0] -= rhs.
m_data[0];
705 m_data[1] -= rhs.
m_data[1];
706 m_data[2] -= rhs.
m_data[2];
707 m_data[3] -= rhs.
m_data[3];
711 template <
typename T>
714 return QuatT<T> ( -m_data[0], -m_data[1], -m_data[2], -m_data[3] );
717 template <
typename T>
720 return std::sqrt( m_data[0] * m_data[0] + m_data[1] * m_data[1] + m_data[2] * m_data[2] + m_data[3] * m_data[3] );
723 template <
typename T>
726 return m_data[0] * m_data[0] + m_data[1] * m_data[1] + m_data[2] * m_data[2] + m_data[3] * m_data[3];
729 template <
typename T>
732 return QuatT( -m_data[0], -m_data[1], -m_data[2], m_data[3] );
735 template <
typename T>
738 return conj() / length2();
742 template <
typename T>
745 return rotate( angle,
Vec3T<T>( x, y, z ) );
748 template <
typename T>
756 template <
typename T>
762 q.
setRotate( angle1, axis1, angle2, axis2, angle3, axis3 );
766 template <
typename T>
775 template <
typename T>
780 Vec3T<T> qvec( m_data[0], m_data[1], m_data[2] );
783 uv *= ( 2.0f * m_data[3] );
788 template <
typename T>
791 T norm = this->length();
803 template <
typename T>
809 template <
typename T>
816 template <
typename T>
827 template <
typename T>
830 output << quat[0] <<
" "
Matrix class for rigid transformations (translation, rotation).
This class provides conversion services between Euler angles in any of the 24 conventions and corresp...
Convention
The 24 Euler conventions.
@ DEFAULT_CONVENTION
The default Euler convention used by agx.
Specialized types of matrices for holding orthogonal transformation matrices.
The object holding quaternions and providing operations on these.
T normalize()
Normalize the quat so that it has unit length.
agx::Real getAngle() const
Get the rotation angle represented by the quaternion.
void getRotate(T &angle, T &x, T &y, T &z) const
Get the angle and vector components represented by the quaternion.
QuatT< T > inverse() const
Multiplicative inverse method: q^(-1) = q^*/(q.q^*)
QuatT()
Default constructor. Create a Quaternion with an identity rotation.
agx::Vec3T< T > getUnitVector() const
Get the rotation unit vector represented by the quaternion.
const QuatT< T > operator/(const QuatT< T > &denom) const
Binary divide.
QuatT< T > & operator/=(T rhs)
Unary divide by scalar rhs.
QuatT< T > & operator*=(T rhs)
Unary multiply by scalar rhs.
bool operator!=(const QuatT< T > &v) const
QuatT< T > & operator=(const QuatT< T > &v)
Assignment operator.
void slerp(T t, const QuatT< T > &from, const QuatT< T > &to)
Spherical Linear Interpolation.
static QuatT< T > rotate(const Vec3T< T > &from, const Vec3T< T > &to)
Static method which constructs and returns a Quaternion from rotating vector from to vector to.
bool zeroRotation() const
void set(const Vec4T< T > &v)
Set the four elements of the quaternion as an Vec4.
const QuatT< T > rightMult(const QuatT< T > &rhs) const
Binary RIGHT multiplication: q = p * rhs ; results in q = p quatmultiply rhs ;.
void setRotate(const Vec3T< T > &from, const Vec3T< T > &to)
Make a rotation QuatT<T> which will rotate from to to Generally take a dot product to get the angle b...
static QuatT< T > rotate(T angle, T x, T y, T z)
Static method which constructs and returns a Quaternion from a rotation given as angle radians around...
QuatT< T > & operator*=(const QuatT< T > &rhs)
Unary LEFT multiply: result is this = rhs quatmultiply this, which makes sense since the notation sug...
void get(EulerAngles &euler) const
Convert this quaternion to an EulerAngles representation.
QuatT(T angle, const Vec3T< T > &axis)
Create a Quaternion calculated from a rotation of angle radians around the rotation axis axis.
QuatT(T angle1, const Vec3T< T > &axis1, T angle2, const Vec3T< T > &axis2, T angle3, const Vec3T< T > &axis3)
Create a Quaternion based on the concatenation between the three specified angle and axis.
static QuatT< T > rotate(T angle, const Vec3T< T > &vec)
Static method which constructs and returns a Quaternion from a rotation given as angle radians around...
const QuatT< T > leftMult(const QuatT< T > &rhs) const
Binary left multiplication: q = p * rhs; results in the OTHER WAY AROUND: q = rhs quatmultiply p;.
QuatT(const AffineMatrix4x4T< T > &matrix)
Create a Quaternion based on the rotation part in the specified Affine 4x4 transformation matrix.
void setRotate(T angle1, const Vec3T< T > &axis1, T angle2, const Vec3T< T > &axis2, T angle3, const Vec3T< T > &axis3)
Set the rotation of this Quaternion as a concatenation of the three angle/axis rotations:
QuatT< T > & set(const EulerAngles &euler)
Set this quaternion with the rotation described by the EulerAngles representation.
QuatT< T > & set(const OrthoMatrix3x3 &matrix)
Set this quaternion with the rotation described by a OrthoMatrix3x3.
void get(T &angle, agx::Vec3T< T > &axis) const
Convert a Quaternion to an axis and angle representation.
QuatT(T x, T y, T z, T w)
Create a Quaternion with the specified scalar values.
void setRotate(T angle, T x, T y, T z)
Set the rotation of the Quaternion as a rotation angle radians around the vector (x,...
void get(OrthoMatrix3x3 &matrix) const
Set an OrthoMatrix3x3 to represent the same rotation as the quaternion.
Vec3T< T > asVec3() const
const QuatT< T > operator*(T rhs) const
Multiply by scalar rhs.
QuatT(const Vec4T< T > &v)
Create a Quaternion based on the 4D vector (x,y,z,w)
Vec3T< T > getAsEulerAngles(agx::EulerConvention::Convention convention=agx::EulerConvention::Convention::DEFAULT_CONVENTION) const
Convert to Euler anglers.
QuatT(const EulerAngles &euler)
Create a Quaternion based on the rotation from euler specified as a EulerAngle.
Vec4T< T > asVec4() const
const QuatT< T > operator*(const QuatT< T > &rhs) const
Binary LEFT multiply: result is q = rhs quatmultiply this, even though the notation is q = this * rhs...
QuatT(const QuatT< T > ©)=default
Copy constructor.
void get(AffineMatrix4x4T< T > &matrix) const
Set the Rotational part of matrix from this quaternion.
void setRotate(T angle, const Vec3T< T > &vec)
Set the rotation of this Quaternion as a rotation angle radians around the vector vec.
bool operator==(const QuatT< T > &v) const
Test for equality.
const QuatT< T > operator-() const
Negation operator - returns the negative of the quaternion.
QuatT(const QuatT< T2 > ©)
Copy constructor for other types.
void getRotate(T &angle, Vec3T< T > &vec) const
Get the angle and vector represented by the quaternion.
const QuatT< T > operator+(const QuatT< T > &rhs) const
Binary addition.
void set(T x, T y, T z, T w)
Set the 4 elements of the quaternion as 4 scalars.
QuatT(const Vec3T< T > &from, const Vec3T< T > &to)
Create a Quaternion which maps the rotation from vector from to the vector to.
QuatT< T > & operator/=(const QuatT< T > &denom)
Unary divide.
QuatT< T > & set(const AffineMatrix4x4T< T > &matrix)
Set this quaternion with the rotational part of matrix.
QuatT< T > & operator+=(const QuatT< T > &rhs)
Unary addition.
QuatT< T > operator/(T rhs) const
Divide by scalar rhs.
QuatT< T > & operator-=(const QuatT< T > &rhs)
Unary subtraction.
static QuatT< T > rotate(T angle1, const Vec3T< T > &axis1, T angle2, const Vec3T< T > &axis2, T angle3, const Vec3T< T > &axis3)
Static method which constructs and returns a Quaternion from a rotation given as a concatenation of t...
A class holding 3 dimensional vectors and providing basic arithmetic.
A class holding 4 dimensional vectors and providing basic arithmetic.
The agx namespace contains the dynamics/math part of the AGX Dynamics API.
std::ostream & operator<<(std::ostream &os, const agx::AddedMassInteraction::Matrix6x6 &m)
static constexpr Real AGX_EQUIVALENT_EPSILON
AGXPHYSICS_EXPORT agx::Bool equivalent(const agx::AddedMassInteraction::Matrix6x6 &lhs, const agx::AddedMassInteraction::Matrix6x6 &rhs, agx::Real eps=agx::RealEpsilon)