00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
#ifndef OPENCAL_UTILS_QUATERNION_H
00012
#define OPENCAL_UTILS_QUATERNION_H
00013
00014
00015
#include <OpenCAL/global.h>
00016
#include <OpenCAL/Vector3.h>
00017
#include <OpenCAL/Matrix33.h>
00018
00019
namespace OpenCAL
00020 {
00021
namespace Utils
00022 {
00027 class OPENCAL_API Quaternion
00028 {
00029
protected:
00030
00031
float m_scalar;
00032
Vector3 m_vector;
00033
00034
public:
00035
00036
static const Quaternion identity;
00037
00038
public:
00039
00040 Quaternion();
00041 Quaternion(
float scalar,
const Vector3 &vector);
00042
virtual ~Quaternion();
00043
00044
00045
float getScalar()
const {
return m_scalar; }
00046
const Vector3 &getVector()
const {
return m_vector; }
00047
00048
00049
void setScalar(
float scalar) { m_scalar = scalar; }
00050
void setVector(
const Vector3 &vector) { m_vector = vector; }
00051
00052
00053 Quaternion operator+(
const Quaternion &q)
const;
00054 Quaternion operator-(
const Quaternion &q)
const;
00055 Quaternion operator*(
const Quaternion &q)
const;
00056 Quaternion operator*(
const Vector3 &v)
const;
00057 Quaternion operator*(
float factor)
const;
00058 Quaternion operator/(
float factor)
const;
00059
00060
void operator+=(
const Quaternion &q);
00061
void operator-=(
const Quaternion &q);
00062
void operator*=(
const Quaternion &q);
00063
void operator*=(
const Vector3 &v);
00064
void operator*=(
float factor);
00065
void operator/=(
float factor);
00066
00067 Quaternion operator-()
const;
00068
00069
bool operator==(
const Quaternion &q)
const;
00070
bool operator!=(
const Quaternion &q)
const;
00071
00072
00073 operator Matrix33()
const {
return toMatrix33(); }
00074
00075
00076
float magnitude()
const;
00077
float magnitudeSquared()
const;
00078
00079
00080
void inverse();
00081 Quaternion inversed()
const;
00082
void inversed(Quaternion *q)
const;
00083
00084
00085
void normalize();
00086 Quaternion normalized()
const;
00087
void normalized(Quaternion *q)
const;
00088
00089
00090
float dotProduct(
const Quaternion &q)
const;
00091
00092
00093
void slerp(
float u,
const Quaternion &dest) { slerp(u, *
this, dest); }
00094
void slerp(
float u,
const Quaternion &source,
const Quaternion &dest) { *
this = slerped(u, source, dest); }
00095 Quaternion slerped(
float u,
const Quaternion &dest)
const {
return slerped(u, *
this, dest); }
00096 Quaternion slerped(
float u,
const Quaternion &source,
const Quaternion &dest)
const;
00097
00098 Quaternion blended(
float u,
const Quaternion &dest)
const {
return slerped(u, dest); }
00099
00100
00101
static Quaternion createFromAxisAngle(
const Vector3 &axis,
float degrees);
00102
void fromAxisAngle(
const Vector3 &axis,
float degrees);
00103
void toAxisAngle(
Vector3 *axis,
float *degrees)
const;
00104
00105
00106
void fromEulerAngle(
float rotX,
float rotY,
float rotZ);
00107
void fromEulerAngle(
const Vector3 &rot);
00108
Vector3 toEulerAngle()
const;
00109
void toEulerAngle(
float *rotX,
float *rotY,
float *rotZ)
const;
00110
void toEulerAngle(
Vector3 *rot)
const;
00111
00112
00113
void fromMatrix33(
const Matrix33 &matrix);
00114
Matrix33 toMatrix33()
const;
00115
void toMatrix33(
Matrix33 *matrix)
const;
00116
00117
00118
void print()
const;
00119
00120
00121
friend Quaternion operator*(
const Vector3 &v,
const Quaternion &q);
00122
friend Quaternion operator*(
float factor,
const Quaternion &q);
00123
friend Quaternion operator/(
float factor,
const Quaternion &q);
00124
friend std::ostream &operator<<(std::ostream &stream,
const Quaternion &q);
00125 };
00126 }
00127 }
00128
00129
#endif // OPENCAL_UTILS_QUATERNION_H