Main Page | Class Hierarchy | Class List | Directories | File List

ProjTransfo.h

00001 #ifndef __PROJ_TRANSFO__
00002 #define __PROJ_TRANSFO__
00003 
00004 #include "Vec4.h"
00005 #include "Vec3.h"
00006 #include <QString>
00007 #include <QDomElement>
00008 #include <QDomDocument>
00009 #include <QGLViewer/camera.h>
00010 
00011 namespace apig {
00012 
00016     class ProjTransfo {
00017         public:
00018             ProjTransfo(float d = 1);       // matrice diagonale avec la valeur 'd' sur la diagonale (l'identité par défaut)
00019             ProjTransfo(float m11, float m12, float m13, float m14,
00020                         float m21, float m22, float m23, float m24,
00021                         float m31, float m32, float m33, float m34,
00022                         float m41, float m42, float m43, float m44);
00023             ProjTransfo(const float  M[16], bool deleteArray = false);  // par colonnes : m_ij = M[i + 4*j]  (ordre OpenGL)
00024             ProjTransfo(const double M[16], bool deleteArray = false);  // par colonnes : m_ij = M[i + 4*j]  (ordre OpenGL)
00025             ProjTransfo(Vec4 O, Vec4 X, Vec4 Y, Vec4 Z, bool relative=false);    // transfo affine
00026             ProjTransfo(Vec3 O, Vec3 X, Vec3 Y, Vec3 Z, bool relative=false);    // transfo affine
00027             ProjTransfo(float xmin, float xmax, float ymin, float ymax, float zmin, float zmax); // [xmin,xmax]*[ymin,ymax]*[zmin,zmax] --> [0,1]³
00028             
00029         // transfomations courantes :
00030         //---------------------------
00031             static ProjTransfo scaling(float sx, float sy, float sz);
00032             static ProjTransfo scaling(Vec3 s);
00033             static ProjTransfo scaling(float s);      // scaling uniforme
00034             static ProjTransfo translation(float tx, float ty, float tz);
00035             static ProjTransfo translation(Vec3 t);
00036             static ProjTransfo translation(float t);    // translation uniforme
00037             static ProjTransfo translationAndScaling(float tx, float ty, float tz, float sx, float sy, float sz);         // translation, puis scaling  (S * T)
00038             static ProjTransfo translationAndScaling(Vec3 t, Vec3 s);
00039             static ProjTransfo translationAndScaling(float t, float s);   // translation puis scaling uniformes
00040             static ProjTransfo scalingAndTranslation(float sx, float sy, float sz, float tx, float ty, float tz);         // scaling, puis translation  (T * S)
00041             static ProjTransfo scalingAndTranslation(Vec3 s, Vec3 t);
00042             static ProjTransfo scalingAndTranslation(float s, float t);   // scaling puis translation uniformes
00043             static ProjTransfo rotation(float theta, Vec3 n, bool isNormed = false);    // précondition : isNormed ou ||n||=1
00044             static ProjTransfo rotation(Vec3 d);    // rotation autour de d, d'angle ||d||
00045     
00046             static ProjTransfo rotation(Vec3 src, Vec3 dst, bool normalized = true);    // rotation d'angle minimal faisant tourner la direction de <src> sur celle de <dst>
00047             
00048         // opérations matricielles :
00049         //--------------------------
00050             ProjTransfo operator*(ProjTransfo P) const;     // composition
00051             Vec4 operator*(Vec4 v) const;                   // application a un vecteur 4
00052             Vec3 operator*(Vec3 v) const;                   // application a un vecteur 3
00053             
00054             ProjTransfo inv() const;
00055             ProjTransfo transposed() const;
00056             void transpose();
00057             
00058         // accès aux coefficients :
00059         //-------------------------
00060             inline const float* coefs() const { return M; }  // le tableau en mémoire contentant les 16 coefficients, rangés par colonnes
00061             
00062             inline float& coef(int i, int j)             { return M[i + 4*j]; }
00063             inline float  coef(int i, int j) const       { return M[i + 4*j]; }
00064             inline float& operator()(int i, int j)       { return coef(i,j); }
00065             inline float  operator()(int i, int j) const { return coef(i,j); }
00066             
00067             Vec4 column(int j) const;
00068             void setColumn(int j, Vec4 c);
00069             
00070         // interactions avec les matrices OpenGL :
00071         //----------------------------------------
00072             static ProjTransfo getGLModelView();
00073             static ProjTransfo getGLProjection();
00074             static ProjTransfo getGLTransform();        // composée des deux précédentes
00075             void glLoadMatrix() const;
00076             void glLoadModelView() const;
00077             void glLoadProjection() const;
00078             void glMultMatrix() const;
00079             void glMultModelView() const;
00080             void glMultProjection() const;
00081             
00082         // récupération de transformations définies dans une qglviewer::Camera :
00083         //----------------------------------------------------------------------
00084             void getModelViewFrom(const qglviewer::Camera &camera);
00085             void getProjectionFrom(const qglviewer::Camera &camera);
00086             
00087         // autres méthodes pratiques :
00088         //----------------------------
00089             // le rapport largeur/hauteur d'une caméra utilisant cette transfo :
00090             float screenRatio(float xMin = -1, float xMax = 1, float yMin = -1, float yMax = 1, float z = 0) const;
00091             // affichage de la transformation inverse d'une boîte rectangulaire :
00092             void drawBox(float xMin = 0, float xMax = 1, float yMin = 0, float yMax = 1, float zMin = 0, float zMax = 1) const;
00093         
00094         // conversion au format XML :
00095         //---------------------------
00096             ProjTransfo(const QDomElement &element);
00097             QDomElement domElement(const QString &name, QDomDocument &document) const;
00098             void initFromDOMElement(const QDomElement &element);
00099             
00100         private:
00101             float M[16];
00102             // les coefficients de la matrice par colonnes (ordre OpenGL) :
00103             // M = | M[0]  M[4]  M[8]  M[12] |   
00104             //     | M[1]  M[5]  M[9]  M[13] |
00105             //     | M[2]  M[6]  M[10] M[14] |
00106             //     | M[3]  M[7]  M[11] M[15] |
00107         };
00108     
00109     }
00110 
00111 #endif
00112 

Generated on Fri Nov 14 20:49:47 2008 for Api Graphics by  doxygen 1.4.4