The Quaternion class represents 3D rotations and orientations. More...
Defining a Quaternion | |
Quaternion () | |
Default constructor, builds an identity rotation. | |
Quaternion (const Vec &axis, double angle) | |
Constructor from rotation axis (non null) and angle (in radians). | |
Quaternion (const Vec &from, const Vec &to) | |
Constructs a Quaternion that will rotate from the from direction to the to direction. | |
Quaternion (double q0, double q1, double q2, double q3) | |
Constructor from the four values of a Quaternion. | |
Quaternion (const Quaternion &Q) | |
Copy constructor. | |
Quaternion & | operator= (const Quaternion &Q) |
Equal operator. | |
void | setAxisAngle (const Vec &axis, double angle) |
Sets the Quaternion as a rotation of axis axis and angle angle (in radians). | |
void | setValue (double q0, double q1, double q2, double q3) |
Sets the Quaternion value. | |
void | setFromRotationMatrix (const float m[3][3]) |
void | setFromRotatedBase (const Vec &X, const Vec &Y, const Vec &Z) |
void | setFromRotationMatrix (const double m[3][3]) |
Set the Quaternion from a (supposedly correct) 3x3 rotation matrix. | |
void | setFromRotatedBasis (const Vec &X, const Vec &Y, const Vec &Z) |
Sets the Quaternion from the three rotated vectors of an orthogonal basis. | |
Accessing values | |
Vec | axis () const |
Returns the normalized axis direction of the rotation represented by the Quaternion. | |
double | angle () const |
Returns the angle (in radians) of the rotation represented by the Quaternion. | |
void | getAxisAngle (Vec &axis, float &angle) const |
Returns the axis vector and the angle (in radians) of the rotation represented by the Quaternion. | |
double | operator[] (int i) const |
Bracket operator, with a constant return value. | |
double & | operator[] (int i) |
Bracket operator returning an l-value. | |
Rotation computations | |
Quaternion & | operator*= (const Quaternion &q) |
Quaternion rotation is composed with q . | |
Vec | rotate (const Vec &v) const |
Returns the image of v by the Quaternion rotation. | |
Vec | inverseRotate (const Vec &v) const |
Returns the image of v by the Quaternion inverse() rotation. | |
Quaternion | operator* (const Quaternion &a, const Quaternion &b) |
Returns the composition of the a and b rotations. | |
Vec | operator* (const Quaternion &q, const Vec &v) |
Returns the image of v by the rotation q . | |
Inversion | |
Quaternion | inverse () const |
Returns the inverse Quaternion (inverse rotation). | |
void | invert () |
Inverses the Quaternion (same rotation angle(), but negated axis()). | |
void | negate () |
Negates all the coefficients of the Quaternion. | |
double | normalize () |
Normalizes the Quaternion coefficients. | |
Quaternion | normalized () const |
Returns a normalized version of the Quaternion. | |
Associated matrix | |
const GLdouble * | matrix () const |
Returns the Quaternion associated 4x4 OpenGL rotation matrix. | |
void | getMatrix (GLdouble m[4][4]) const |
Fills m with the OpenGL representation of the Quaternion rotation. | |
void | getMatrix (GLdouble m[16]) const |
Same as getMatrix(), but with a GLdouble [16] parameter. | |
void | getRotationMatrix (float m[3][3]) const |
Fills m with the 3x3 rotation matrix associated with the Quaternion. | |
const GLdouble * | inverseMatrix () const |
Returns the associated 4x4 OpenGL inverse rotation matrix. | |
void | getInverseMatrix (GLdouble m[4][4]) const |
Fills m with the OpenGL matrix corresponding to the inverse() rotation. | |
void | getInverseMatrix (GLdouble m[16]) const |
Same as getInverseMatrix(), but with a GLdouble [16] parameter. | |
void | getInverseRotationMatrix (float m[3][3]) const |
m is set to the 3x3 inverse rotation matrix associated with the Quaternion. | |
Slerp interpolation | |
Quaternion | log () |
Returns the logarithm of the Quaternion. | |
Quaternion | exp () |
Returns the exponential of the Quaternion. | |
static Quaternion | slerp (const Quaternion &a, const Quaternion &b, float t, bool allowFlip=true) |
Returns the slerp interpolation of Quaternions a and b , at time t . | |
static Quaternion | squad (const Quaternion &a, const Quaternion &tgA, const Quaternion &tgB, const Quaternion &b, float t) |
Returns the slerp interpolation of the two Quaternions a and b , at time t , using tangents tgA and tgB . | |
static double | dot (const Quaternion &a, const Quaternion &b) |
Returns the "dot" product of a and b: a[0]*b[0] + a[1]*b[1] + a[2]*b[2] + a[3]*b[3]. | |
static Quaternion | lnDif (const Quaternion &a, const Quaternion &b) |
Returns log(a. | |
static Quaternion | squadTangent (const Quaternion &before, const Quaternion ¢er, const Quaternion &after) |
Returns a tangent Quaternion for center , defined by before and after Quaternions. | |
Random Quaternion | |
static Quaternion | randomQuaternion () |
Returns a random unit Quaternion. | |
XML representation | |
Quaternion (const QDomElement &element) | |
Constructs a Quaternion from a QDomElement representing an XML code of the form. | |
QDomElement | domElement (const QString &name, QDomDocument &document) const |
Returns an XML QDomElement that represents the Quaternion. | |
void | initFromDOMElement (const QDomElement &element) |
Restores the Quaternion state from a QDomElement created by domElement(). | |
Detailed Description
The Quaternion class represents 3D rotations and orientations.
The Quaternion is an appropriate (although not very intuitive) representation for 3D rotations and orientations. Many tools are provided to ease the definition of a Quaternion: see constructors, setAxisAngle(), setFromRotationMatrix(), setFromRotatedBasis().
You can apply the rotation represented by the Quaternion to 3D points using rotate() and inverseRotate(). See also the Frame class that represents a coordinate system and provides other conversion functions like Frame::coordinatesOf() and Frame::transformOf().
You can apply the Quaternion q
rotation to the OpenGL matrices using:
Quaternion is part of the qglviewer
namespace, specify qglviewer::Quaternion
or use the qglviewer namespace:
Internal representation
The internal representation of a Quaternion corresponding to a rotation around axis axis
, with an angle alpha
is made of four doubles q[i]:
Note that certain implementations place the cosine term in first position (instead of last here).
The Quaternion is always normalized, so that its inverse() is actually its conjugate.
See also the Vec and Frame classes' documentations.
Definition at line 66 of file quaternion.h.
Constructor & Destructor Documentation
|
inline |
Default constructor, builds an identity rotation.
Definition at line 72 of file quaternion.h.
|
inline |
Constructor from rotation axis (non null) and angle (in radians).
See also setAxisAngle().
Definition at line 76 of file quaternion.h.
Quaternion | ( | const Vec & | from, |
const Vec & | to | ||
) |
Constructs a Quaternion that will rotate from the from
direction to the to
direction.
Note that this rotation is not uniquely defined. The selected axis is usually orthogonal to from
and to
, minimizing the rotation angle. This method is robust and can handle small or almost identical vectors.
Definition at line 35 of file quaternion.cpp.
References Vec::orthogonalVec(), and Vec::squaredNorm().
|
inline |
Constructor from the four values of a Quaternion.
First three values are axis*sin(angle/2) and last one is cos(angle/2).
- Attention
- The identity Quaternion is Quaternion(0,0,0,1) and not Quaternion(0,0,0,0) (which is not unitary). The default Quaternion() creates such identity Quaternion.
Definition at line 88 of file quaternion.h.
|
inline |
Copy constructor.
Definition at line 92 of file quaternion.h.
|
explicit |
Constructs a Quaternion from a QDomElement
representing an XML code of the form.
If one of these attributes is missing or is not a number, a warning is displayed and the associated value is respectively set to 0, 0, 0 and 1 (identity Quaternion).
See also domElement() and initFromDOMElement().
Definition at line 286 of file quaternion.cpp.
Member Function Documentation
double angle | ( | ) | const |
Returns the angle (in radians) of the rotation represented by the Quaternion.
This value is always in the range [0-pi]. Larger rotational angles are obtained by inverting the axis() direction.
See also axis() and getAxisAngle().
Definition at line 234 of file quaternion.cpp.
Referenced by Frame::rotateAroundPoint().
Vec axis | ( | ) | const |
Returns the normalized axis direction of the rotation represented by the Quaternion.
It is null for an identity Quaternion. See also angle() and getAxisAngle().
Definition at line 219 of file quaternion.cpp.
References Vec::norm().
Referenced by Frame::rotateAroundPoint().
QDomElement domElement | ( | const QString & | name, |
QDomDocument & | document | ||
) | const |
Returns an XML QDomElement
that represents the Quaternion.
name
is the name of the QDomElement tag. doc
is the QDomDocument
factory used to create QDomElement.
When output to a file, the resulting QDomElement will look like:
Use initFromDOMElement() to restore the Quaternion state from the resulting QDomElement
. See also the Quaternion(const QDomElement&) constructor.
See the Vec::domElement() documentation for a complete QDomDocument creation and saving example.
See also Frame::domElement(), Camera::domElement(), KeyFrameInterpolator::domElement()...
Definition at line 256 of file quaternion.cpp.
|
inlinestatic |
Returns the "dot" product of a
and b:
a[0]*b[0] + a[1]*b[1] + a[2]*b[2] + a[3]*b[3].
Definition at line 270 of file quaternion.h.
Referenced by Quaternion::slerp().
Quaternion exp | ( | ) |
Returns the exponential of the Quaternion.
See also log().
Definition at line 493 of file quaternion.cpp.
Referenced by Quaternion::squadTangent().
void getAxisAngle | ( | Vec & | axis, |
float & | angle | ||
) | const |
Returns the axis vector and the angle (in radians) of the rotation represented by the Quaternion.
See the axis() and angle() documentations.
Definition at line 201 of file quaternion.cpp.
References Vec::norm().
void getInverseMatrix | ( | GLdouble | m[4][4] | ) | const |
Fills m
with the OpenGL matrix corresponding to the inverse() rotation.
Use inverseMatrix() if you do not need to store this matrix and simply want to alter the current OpenGL matrix. See also getMatrix().
Definition at line 404 of file quaternion.cpp.
void getInverseMatrix | ( | GLdouble | m[16] | ) | const |
Same as getInverseMatrix(), but with a GLdouble
[16] parameter.
See also getMatrix().
Definition at line 410 of file quaternion.cpp.
void getInverseRotationMatrix | ( | float | m[3][3] | ) | const |
m
is set to the 3x3 inverse rotation matrix associated with the Quaternion.
- Attention
- This is the classical mathematical rotation matrix. The OpenGL format uses its transposed version. See inverseMatrix() and getInverseMatrix().
Definition at line 419 of file quaternion.cpp.
void getMatrix | ( | GLdouble | m[4][4] | ) | const |
Fills m
with the OpenGL representation of the Quaternion rotation.
Use matrix() if you do not need to store this matrix and simply want to alter the current OpenGL matrix. See also getInverseMatrix() and Frame::getMatrix().
Definition at line 321 of file quaternion.cpp.
Referenced by Frame::getMatrix().
void getMatrix | ( | GLdouble | m[16] | ) | const |
Same as getMatrix(), but with a GLdouble
[16] parameter.
See also getInverseMatrix() and Frame::getMatrix().
Definition at line 359 of file quaternion.cpp.
void getRotationMatrix | ( | float | m[3][3] | ) | const |
Fills m
with the 3x3 rotation matrix associated with the Quaternion.
See also getInverseRotationMatrix().
- Attention
m
uses the European mathematical representation of the rotation matrix. Use matrix() and getMatrix() to retrieve the OpenGL transposed version.
Definition at line 375 of file quaternion.cpp.
void initFromDOMElement | ( | const QDomElement & | element | ) |
Restores the Quaternion state from a QDomElement
created by domElement().
The QDomElement
should contain the q0
, q1
, q2
and q3
attributes. If one of these attributes is missing or is not a number, a warning is displayed and these fields are respectively set to 0.0, 0.0, 0.0 and 1.0 (identity Quaternion).
See also the Quaternion(const QDomElement&) constructor.
Definition at line 273 of file quaternion.cpp.
|
inline |
Returns the inverse Quaternion (inverse rotation).
Result has a negated axis() direction and the same angle(). A composition (see operator*()) of a Quaternion and its inverse() results in an identity function.
Use invert() to actually modify the Quaternion.
Definition at line 205 of file quaternion.h.
Referenced by Frame::inverse(), Quaternion::lnDif(), Frame::setOrientationWithConstraint(), Frame::setPositionAndOrientation(), Frame::setPositionAndOrientationWithConstraint(), Frame::setRotationWithConstraint(), and Frame::setTranslationAndRotationWithConstraint().
const GLdouble * inverseMatrix | ( | ) | const |
Returns the associated 4x4 OpenGL inverse rotation matrix.
This is simply the matrix() of the inverse().
- Attention
- The result is only valid until the next call to inverseMatrix(). Use it immediately (as in
glMultMatrixd
(q.inverseMatrix())) or use getInverseMatrix() instead. - The matrix is given in OpenGL format (row-major order) and is the transpose of the actual mathematical European representation. Consider using getInverseRotationMatrix() instead.
Definition at line 393 of file quaternion.cpp.
Returns the image of v
by the Quaternion inverse() rotation.
rotate() performs an inverse transformation. Same as inverse().rotate(v).
Definition at line 68 of file quaternion.cpp.
Referenced by Frame::inverse(), Frame::localCoordinatesOf(), and Frame::localTransformOf().
|
inline |
Inverses the Quaternion (same rotation angle(), but negated axis()).
See also inverse().
Definition at line 210 of file quaternion.h.
|
static |
Returns log(a.
inverse() * b). Useful for squadTangent().
Definition at line 507 of file quaternion.cpp.
References Quaternion::inverse(), Quaternion::log(), and Quaternion::normalize().
Referenced by Quaternion::squadTangent().
Quaternion log | ( | ) |
Returns the logarithm of the Quaternion.
See also exp().
Definition at line 479 of file quaternion.cpp.
Referenced by Quaternion::lnDif().
const GLdouble * matrix | ( | ) | const |
Returns the Quaternion associated 4x4 OpenGL rotation matrix.
Use glMultMatrixd
(q.matrix()) to apply the rotation represented by Quaternion q
to the current OpenGL matrix.
See also getMatrix(), getRotationMatrix() and inverseMatrix().
- Attention
- The result is only valid until the next call to matrix(). Use it immediately (as shown above) or consider using getMatrix() instead.
- The matrix is given in OpenGL format (row-major order) and is the transpose of the actual mathematical European representation. Consider using getRotationMatrix() instead.
Definition at line 310 of file quaternion.cpp.
Referenced by RenderWObjectContainer::drawCylinder().
|
inline |
Negates all the coefficients of the Quaternion.
This results in an other representation of the same rotation (opposite rotation angle, but with a negated axis direction: the two cancel out). However, note that the results of axis() and angle() are unchanged after a call to this method since angle() always returns a value in [0,pi].
This method is mainly useful for Quaternion interpolation, so that the spherical interpolation takes the shortest path on the unit sphere. See slerp() for details.
Definition at line 220 of file quaternion.h.
|
inline |
Normalizes the Quaternion coefficients.
This method should not need to be called since we only deal with unit Quaternions. This is however useful to prevent numerical drifts, especially with small rotational increments. See also normalized().
Definition at line 227 of file quaternion.h.
Referenced by Quaternion::lnDif(), Frame::rotate(), Frame::rotateAroundPoint(), Frame::setRotationWithConstraint(), and Frame::setTranslationAndRotationWithConstraint().
|
inline |
Returns a normalized version of the Quaternion.
See also normalize().
Definition at line 238 of file quaternion.h.
Referenced by Frame::initFromDOMElement().
|
inline |
Quaternion rotation is composed with q
.
See operator*(), since this is equivalent to this
= this
* q
.
- Note
- For efficiency reasons, the resulting Quaternion is not normalized. You may normalize() it after each application in case of numerical drift.
Definition at line 178 of file quaternion.h.
|
inline |
Equal operator.
Definition at line 96 of file quaternion.h.
|
inline |
Bracket operator, with a constant return value.
i
must range in [0..3]. See the Quaternion(double, double, double, double) documentation.
Definition at line 144 of file quaternion.h.
|
inline |
Bracket operator returning an l-value.
i
must range in [0..3]. See the Quaternion(double, double, double, double) documentation.
Definition at line 147 of file quaternion.h.
|
static |
Returns a random unit Quaternion.
You can create a randomly directed unit vector using:
- Note
- This function uses rand() to create pseudo-random numbers and the random number generator can be initialized using srand().
Definition at line 546 of file quaternion.cpp.
Returns the image of v
by the Quaternion rotation.
See also inverseRotate() and operator*(const Quaternion&, const Vec&).
Definition at line 76 of file quaternion.cpp.
Referenced by LocalConstraint::constrainTranslation(), Frame::localInverseCoordinatesOf(), Frame::localInverseTransformOf(), ManipulatedFrame::mouseMoveEvent(), Camera::setFromModelViewMatrix(), and ManipulatedFrame::wheelEvent().
|
inline |
Sets the Quaternion as a rotation of axis axis
and angle angle
(in radians).
axis
does not need to be normalized. A null axis
will result in an identity Quaternion.
Definition at line 106 of file quaternion.h.
References Vec::norm().
Sets the Quaternion from the three rotated vectors of an orthogonal basis.
The three vectors do not have to be normalized but must be orthogonal and direct (X^Y=k*Z, with k>0).
See also setFromRotationMatrix() and Quaternion(const Vec&, const Vec&).
Definition at line 182 of file quaternion.cpp.
References Vec::norm().
Referenced by Camera::setViewDirection().
void setFromRotationMatrix | ( | const double | m[3][3] | ) |
Set the Quaternion from a (supposedly correct) 3x3 rotation matrix.
The matrix is expressed in European format: its three columns are the images by the rotation of the three vectors of an orthogonal basis. Note that OpenGL uses a symmetric representation for its matrices.
setFromRotatedBasis() sets a Quaternion from the three axis of a rotated frame. It actually fills the three columns of a matrix with these rotated basis vectors and calls this method.
Definition at line 104 of file quaternion.cpp.
|
inline |
Sets the Quaternion value.
See the Quaternion(double, double, double, double) constructor documentation.
Definition at line 125 of file quaternion.h.
|
static |
Returns the slerp interpolation of Quaternions a
and b
, at time t
.
t
should range in [0,1]. Result is a
when t=0
and b
when t=1
.
When allowFlip
is true
(default) the slerp interpolation will always use the "shortest path" between the Quaternions' orientations, by "flipping" the source Quaternion if needed (see negate()).
Definition at line 437 of file quaternion.cpp.
References Quaternion::dot().
Referenced by Quaternion::squad().
|
static |
Returns the slerp interpolation of the two Quaternions a
and b
, at time t
, using tangents tgA
and tgB
.
The resulting Quaternion is "between" a
and b
(result is a
when t=0
and b
for t=1
).
Use squadTangent() to define the Quaternion tangents tgA
and tgB
.
Definition at line 471 of file quaternion.cpp.
References Quaternion::slerp().
Referenced by KeyFrameInterpolator::drawPath(), and KeyFrameInterpolator::interpolateAtTime().
|
static |
Returns a tangent Quaternion for center
, defined by before
and after
Quaternions.
Useful for smooth spline interpolation of Quaternion with squad() and slerp().
Definition at line 517 of file quaternion.cpp.
References Quaternion::exp(), and Quaternion::lnDif().
Friends And Related Function Documentation
|
friend |
Returns the composition of the a
and b
rotations.
The order is important. When applied to a Vec v
(see operator*(const Quaternion&, const Vec&) and rotate()) the resulting Quaternion acts as if b
was applied first and then a
was applied. This is obvious since the image v'
of v
by the composited rotation satisfies:
Note that a*b usually differs from b*a.
- Attention
- For efficiency reasons, the resulting Quaternion is not normalized. Use normalize() in case of numerical drift with small rotation composition.
Definition at line 164 of file quaternion.h.
|
friend |
Returns the image of v
by the rotation q
.
Same as q.rotate(v). See rotate() and inverseRotate().
Definition at line 187 of file quaternion.h.
The documentation for this class was generated from the following files:
- worldsim/3rdParts/qglviewer/quaternion.h
- worldsim/3rdParts/qglviewer/quaternion.cpp