00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00042
00043
00044 #ifndef _MATHUTILS_H
00045 #define _MATHUTILS_H
00046
00047 #include <vector>
00048
00049 #include "../dllinclude.h"
00050
00051
00052 #define Q_X 0
00053 #define Q_Y 1
00054 #define Q_Z 2
00055 #define Q_W 3
00056
00067 namespace ot {
00068
00069 class OPENTRACKER_API MathUtils
00070 {
00071 public:
00073 typedef double Matrix3x3[3][3];
00075 typedef double Matrix4x4[4][4];
00077 typedef double Vector3[3];
00079 typedef double Quaternion[4];
00080
00082 enum EULER {
00083
00084
00085
00086
00087
00088
00089 XYX = 0 + 4 + 0,
00090 XYZ = 0 + 4 + 2,
00091 XZX = 0 + 8 + 0,
00092 XZY = 0 + 8 + 1,
00093 YXY = 16 + 0 + 1,
00094 YXZ = 16 + 0 + 2,
00095 YZX = 16 + 8 + 0,
00096 YZY = 16 + 8 + 1,
00097 ZXY = 32 + 0 + 1,
00098 ZXZ = 32 + 0 + 2,
00099 ZYX = 32 + 4 + 0,
00100 ZYZ = 32 + 4 + 2
00101 };
00102
00109 static float* axisAngleToQuaternion(const float* axisa, float* qResult);
00116 static std::vector<float>& axisAngleToQuaternion(const std::vector<float> &axisa, std::vector<float> &qResult);
00123 static double* axisAngleToQuaternion(const double* axisa, Quaternion qResult);
00131 static float* eulerToQuaternion(const float roll, const float pitch, const float yaw, float* qResult);
00139 static std::vector<float>& eulerToQuaternion(const float roll, const float pitch, const float yaw, std::vector<float> &qResult);
00150 static float * eulerToQuaternion( const double alpha, const double beta,
00151 const double gamma, const enum MathUtils::EULER sequence,
00152 float * qResult );
00159 static float* invertQuaternion(const float* q, float* qResult);
00166 static std::vector<float>& invertQuaternion(const std::vector<float> &q, std::vector<float> &qResult);
00171 static float* matrixToQuaternion(const float matrix[3][3], float* qResult);
00176 static std::vector<float>& matrixToQuaternion(const float matrix[3][3], std::vector<float> &qResult);
00184 static float* multiplyQuaternion(const float* q1, const float* q2, float* qResult);
00192 static std::vector<float>& multiplyQuaternion(const std::vector<float> &q1, const std::vector<float> &q2, std::vector<float> &qResult);
00200 static double* multiplyQuaternion(const Quaternion q1, const Quaternion q2, Quaternion qResult);
00205 static float* normalizeQuaternion(float* q);
00210 static std::vector<float>& normalizeQuaternion(std::vector<float> &q);
00215 static double* normalizeQuaternion(Quaternion q);
00224 static float* rotateVector(const float* q, const float* v, float* vResult);
00233 static std::vector<float>& rotateVector(const std::vector<float> &q, const std::vector<float> &v, std::vector<float> &vResult);
00234
00238 static float determinant( const float matrix[3][3] );
00239
00246 static float* quaternionToAxisAngle(const float *q, float *axisa);
00247
00254 static void quaternionToAxisAngle(std::vector<float> &q, std::vector<float> &axisa);
00255
00256
00257 void translationQuaternionTo4x4Matrix(std::vector<float>& pos, std::vector<float>& quat, MathUtils::Matrix4x4& mat);
00258
00266 static double angle( const float * v1, const float * v2, const int dim );
00274 static double angle( const std::vector<float> &v1, const std::vector<float> & v2, const int dim );
00282 static double dot( const float * v1, const float * v2, const int dim );
00290 static double dot( const std::vector<float> &v1, const std::vector<float> &v2, const int dim );
00304 static float * slerp( const float * q1, const float *q2, const float t, float * qResult );
00318 static std::vector<float>& slerp( const std::vector<float> &q1, const std::vector<float> &q2, const float t, std::vector<float> &qResult );
00319
00320 static void quaternionToMatrix( Quaternion &q, Matrix4x4 &m);
00321 static void matrixToQuaternion( Matrix4x4& matrix, Quaternion& qResult);
00322
00323 static void matrixMultiply(const Matrix4x4 m1, const Matrix4x4 m2, Matrix4x4 &m);
00324 static void matrixMultiply(const Matrix3x3 m1, const Matrix3x3 m2, Matrix3x3 &m);
00325
00327 static const Matrix4x4 matrix4x4_flipY;
00329 static const Matrix4x4 matrix4x4_identity;
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349 static void MatrixToEuler(Vector3 angles, const Matrix4x4 colMatrix);
00350
00352 static const double Pi;
00353
00355 static const double E;
00356
00358 static const double GradToRad;
00359 };
00360
00361 }
00362
00363 #endif
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379