17#ifndef MOMENTUM_QUAT_H
18#define MOMENTUM_QUAT_H
20#include "momentum_namespace.h"
21#include "momentum_math.h"
25#include "EulerConvention.h"
32# pragma warning(disable: 6385)
40 class AffineMatrix4x4;
59 operator agx::Quat()
const
61 return agx::Quat(this->x(), this->y(), this->z(), this->w());
64 Quat(
const agx::Quat q)
66 set(q.x(), q.y(), q.z(), q.w());
77 Quat(
double x,
double y,
double z,
double w);
83 Quat(
double angle,
const Vec3& axis);
88 Quat(
double angle1,
const Vec3& axis1,
89 double angle2,
const Vec3& axis2,
90 double angle3,
const Vec3& axis3);
119 bool operator == (
const Quat& v)
const;
124 bool operator != (
const Quat& v)
const;
137 void set(
double x,
double y,
double z,
double w);
140 void set(
const Vec4& v);
177 double& operator [] (
int i);
180 double operator [] (
int i)
const;
183 double setX(
double val);
186 double setY(
double val);
189 double setZ(
double val);
192 double setW(
double val);
209 bool zeroRotation()
const;
220 const Quat operator * (
double rhs)
const;
223 Quat operator *= (
double rhs);
241 const Quat leftMult(
const Quat& rhs)
const;
247 const Quat rightMult(
const Quat& rhs)
const;
251 Quat operator / (
double rhs)
const;
254 Quat operator /= (
double rhs);
257 const Quat operator/(
const Quat& denom)
const;
263 const Quat operator + (
const Quat& rhs)
const;
269 const Quat operator - (
const Quat& rhs)
const;
278 const Quat operator - ()
const;
281 double length()
const;
284 double length2()
const;
290 Quat inverse()
const;
295 void setRotate(
double angle,
double x,
double y,
double z);
308 double angle2,
const Vec3& axis2,
309 double angle3,
const Vec3& axis3);
323 static Quat rotate(
double angle,
double x,
double y,
double z);
328 static Quat rotate(
double angle,
const Vec3& vec);
335 static Quat rotate(
double angle1,
const Vec3& axis1,
336 double angle2,
const Vec3& axis2,
337 double angle3,
const Vec3& axis3);
358 Vec3 operator* (
const Vec3& v)
const;
404 double angle2,
const Vec3& axis2,
405 double angle3,
const Vec3& axis3)
407 setRotate(angle1, axis1, angle2, axis2, angle3, axis3);
423 m_data[0] = copy.m_data[0];
424 m_data[1] = copy.m_data[1];
425 m_data[2] = copy.m_data[2];
426 m_data[3] = copy.m_data[3];
437 m_data[0] = v.m_data[0];
438 m_data[1] = v.m_data[1];
439 m_data[2] = v.m_data[2];
440 m_data[3] = v.m_data[3];
446 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];
451 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];
456 return Vec4(m_data[0], m_data[1], m_data[2], m_data[3]);
461 return Vec3(m_data[0], m_data[1], m_data[2]);
464 inline void Quat::set(
double x,
double y,
double z,
double w)
538 return m_data[0] == 0.0 && m_data[1] == 0.0 && m_data[2] == 0.0 && m_data[3] == 1.0;
544 return Quat(m_data[0] * rhs, m_data[1] * rhs, m_data[2] * rhs, m_data[3] * rhs);
558 return Quat(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],
559 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],
560 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],
561 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]);
566 double 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];
567 double 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];
568 double 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];
569 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];
580 return (*
this) * rhs;
585 return rhs * (*this);
591 double div = double(1) / rhs;
592 return Quat(m_data[0] * div, m_data[1] * div, m_data[2] * div, m_data[3] * div);
597 double div = double(1) / rhs;
607 return ((*
this) * denom.
inverse());
612 (*this) = (*this) * denom.
inverse();
618 return Quat(m_data[0] + rhs.m_data[0], m_data[1] + rhs.m_data[1],
619 m_data[2] + rhs.m_data[2], m_data[3] + rhs.m_data[3]);
624 m_data[0] += rhs.m_data[0];
625 m_data[1] += rhs.m_data[1];
626 m_data[2] += rhs.m_data[2];
627 m_data[3] += rhs.m_data[3];
633 return Quat(m_data[0] - rhs.m_data[0], m_data[1] - rhs.m_data[1],
634 m_data[2] - rhs.m_data[2], m_data[3] - rhs.m_data[3]);
639 m_data[0] -= rhs.m_data[0];
640 m_data[1] -= rhs.m_data[1];
641 m_data[2] -= rhs.m_data[2];
642 m_data[3] -= rhs.m_data[3];
648 return Quat(-m_data[0], -m_data[1], -m_data[2], -m_data[3]);
653 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]);
658 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];
663 return Quat(-m_data[0], -m_data[1], -m_data[2], m_data[3]);
684 double angle2,
const Vec3& axis2,
685 double angle3,
const Vec3& axis3)
688 q.
setRotate(angle1, axis1, angle2, axis2, angle3, axis3);
703 Vec3 qvec(m_data[0], m_data[1], m_data[2]);
706 uv *= (2.0f * m_data[3]);
713 double norm = this->
length();
715 double inv = double(1) / norm;
724 template <
typename T>
727 output << quat[0] <<
" "
738 agx::equivalent( a[ 0 ], b[ 0 ], epsilon ) &&
739 agx::equivalent( a[ 1 ], b[ 1 ], epsilon ) &&
740 agx::equivalent( a[ 2 ], b[ 2 ], epsilon ) &&
741 agx::equivalent( a[ 3 ], b[ 3 ], epsilon );
Matrix class for rigid transformations (translation, rotation).
Definition: AffineMatrix4x4.h:51
This class provides conversion services between Euler angles in any of the 24 conventions and corresp...
Definition: EulerAngles.h:64
Convention
Definition: EulerConvention.h:32
The object holding quaternions and providing operations on these.
Definition: Quat.h:55
void set(double x, double y, double z, double w)
Set the 4 elements of the quaternion as 4 scalars.
Definition: Quat.h:464
double & operator[](int i)
Definition: Quat.h:486
bool operator==(const Quat &v) const
Test for equality.
Definition: Quat.h:444
Vec4 asVec4() const
Definition: Quat.h:454
Quat()
Default constructor. Create a Quaternion with an identity rotation.
Definition: Quat.h:374
double setW(double val)
Definition: Quat.h:510
double length() const
Definition: Quat.h:651
Quat operator*=(double rhs)
Unary multiply by scalar rhs.
Definition: Quat.h:547
const Quat operator*(double rhs) const
Multiply by scalar rhs.
Definition: Quat.h:542
Quat conj() const
Definition: Quat.h:661
const Quat operator+(const Quat &rhs) const
Binary addition.
Definition: Quat.h:616
std::pair< double, Vec3 > getRotate() const
Get the angle and vector represented by the quaternion.
void setRotate(const Vec3 &from, const Vec3 &to)
Make a rotation Quat which will rotate from to to Generally take a dot product to get the angle betwe...
bool operator!=(const Quat &v) const
Definition: Quat.h:449
Quat operator/=(double rhs)
Unary divide by scalar rhs.
Definition: Quat.h:595
Quat operator+=(const Quat &rhs)
Unary addition.
Definition: Quat.h:622
void setRotate(double angle1, const Vec3 &axis1, double angle2, const Vec3 &axis2, double angle3, const Vec3 &axis3)
Set the rotation of this Quaternion as a concatenation of the three angle/axis rotations:
void setRotate(double angle, double x, double y, double z)
Set the rotation of the Quaternion as a rotation angle radians around the vector (x,...
Quat operator/(double rhs) const
Divide by scalar rhs.
Definition: Quat.h:589
double z() const
Definition: Quat.h:526
double length2() const
Definition: Quat.h:656
void slerp(double t, const Quat &from, const Quat &to)
Spherical Linear Interpolation.
double normalize()
Normalize the quat so that it has unit length.
Definition: Quat.h:711
void setRotate(double angle, const Vec3 &vec)
Set the rotation of this Quaternion as a rotation angle radians around the vector vec.
double w() const
Definition: Quat.h:531
Quat inverse() const
Multiplicative inverse method: q^(-1) = q^*/(q.q^*)
Definition: Quat.h:666
std::pair< double, Vec3 > getAsAngleAndVector() const
Convert a Quaternion to an axis and angle representation.
Quat set(const EulerAngles &euler)
Set this quaternion with the rotation described by the EulerAngles representation.
AffineMatrix4x4 get(const AffineMatrix4x4 &matrix) const
Set the Rotational part of matrix from this quaternion.
Quat set(const AffineMatrix4x4 &matrix)
Set this quaternion with the rotational part of matrix.
const Quat rightMult(const Quat &rhs) const
Binary RIGHT multiplication: q = p * rhs ; results in q = p quatmultiply rhs ;.
Definition: Quat.h:583
Vec3 getAsEulerAngles(EulerConvention::Convention convention=EulerConvention::Convention::DEFAULT_CONVENTION) const
Convert to Euler anglers.
static Quat rotate(double angle, double x, double y, double z)
Static method which constructs and returns a Quaternion from a rotation given as angle radians around...
Definition: Quat.h:671
double setX(double val)
Definition: Quat.h:492
const Quat operator-() const
Negation operator - returns the negative of the quaternion.
Definition: Quat.h:646
bool zeroRotation() const
Definition: Quat.h:536
double x() const
Definition: Quat.h:516
Quat operator=(const Quat &v)
Assignment operator.
Definition: Quat.h:435
Quat operator-=(const Quat &rhs)
Unary subtraction.
Definition: Quat.h:637
Vec3 asVec3() const
Definition: Quat.h:459
double setZ(double val)
Definition: Quat.h:504
double y() const
Definition: Quat.h:521
const Quat leftMult(const Quat &rhs) const
Binary left multiplication: q = p * rhs; results in the OTHER WAY AROUND: q = rhs quatmultiply p;.
Definition: Quat.h:578
double setY(double val)
Definition: Quat.h:498
A 3 dimensional vector which can be used to define a point or a vector and contains basic arithmetic.
Definition: Vec3.h:40
A 4 dimensional vector and contains basic arithmetic.
Definition: Vec4.h:33
double z() const
Definition: Vec4.h:466
double w() const
Definition: Vec4.h:472
double y() const
Definition: Vec4.h:461
double x() const
Definition: Vec4.h:455
Namespace for Momentum Scripting API.
Definition: AffineMatrix4x4.h:29
const double MOMENTUM_EQUIVALENT_EPSILON
Definition: momentum_math.h:30
std::ostream & operator<<(std::ostream &os, const EulerAngles &e)
Definition: EulerAngles.h:358
Vec3 operator*(const Vec3 &v, const Matrix3x3 &m)
Definition: Matrix3x3.h:746
bool equivalent(const Matrix3x3 &a, const Matrix3x3 &b, double epsilon=1e-6)
Definition: Matrix3x3.h:905