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 #ifndef QGLVIEWER_CONSTRAINT_H
00026 #define QGLVIEWER_CONSTRAINT_H
00027
00028 #include "vec.h"
00029 #include "quaternion.h"
00030
00031 namespace qglviewer {
00032 class Frame;
00033 class Camera;
00034
00110 class QGLVIEWER_EXPORT Constraint
00111 {
00112 public:
00114 virtual ~Constraint() {};
00115
00123 virtual void constrainTranslation(Vec&, Frame* const) {};
00124
00131 virtual void constrainRotation(Quaternion& , Frame* const) {};
00132 };
00133
00164 class QGLVIEWER_EXPORT AxisPlaneConstraint : public Constraint
00165 {
00166 public:
00167 AxisPlaneConstraint();
00169 virtual ~AxisPlaneConstraint() {};
00170
00181 enum Type { FREE, PLANE, AXIS, FORBIDDEN };
00182
00189 virtual void constrainTranslation(Vec&, Frame* const)=0;
00190
00191 void setTranslationConstraint(const Type t, const Vec& dir);
00192 void setTranslationConstraint(const Type t, const float x, const float y, const float z);
00194 void setTranslationConstraintType(const Type t) { translationConstraint_ = t; };
00195 void setTranslationConstraintDir(const Vec& dir);
00196
00199 Type translationConstraintType() const { return translationConstraint_; };
00200
00202 void getTranslationConstraintDir(float& x, float& y, float& z) const;
00203
00209 Vec translationConstraintDir() const { return translationConstraintDir_; };
00211
00218 virtual void constrainRotation(Quaternion& , Frame* const)=0;
00219
00220 void setRotationConstraint(const Type t, const Vec& dir);
00221 void setRotationConstraint(const Type t, const float x, const float y, const float z);
00222 void setRotationConstraintType(const Type t);
00223 void setRotationConstraintDir(const Vec& dir);
00224
00227 Type rotationConstraintType() const { return rotationConstraint_; };
00228
00230 void getRotationConstraintDir(float& x, float& y, float& z) const;
00236 Vec rotationConstraintDir() const { return rotationConstraintDir_; };
00238
00239 private:
00241 Type translationConstraint_;
00243 Type rotationConstraint_;
00244
00246 Vec translationConstraintDir_;
00248 Vec rotationConstraintDir_;
00249 };
00250
00251
00253 class QGLVIEWER_EXPORT LocalConstraint : public AxisPlaneConstraint
00254 {
00255 public:
00257 virtual ~LocalConstraint() {};
00258
00259 virtual void constrainTranslation(Vec& , Frame* const);
00260 virtual void constrainRotation (Quaternion& , Frame* const);
00261 };
00262
00263
00264
00266 class QGLVIEWER_EXPORT WorldConstraint : public AxisPlaneConstraint
00267 {
00268 public:
00270 virtual ~WorldConstraint() {};
00271
00272 virtual void constrainTranslation(Vec& , Frame* const);
00273 virtual void constrainRotation (Quaternion& , Frame* const);
00274 };
00275
00276
00278 class QGLVIEWER_EXPORT CameraConstraint : public AxisPlaneConstraint
00279 {
00280 public:
00281 explicit CameraConstraint(const Camera* const cam);
00283 virtual ~CameraConstraint() {};
00284
00285 virtual void constrainTranslation(Vec& , Frame* const);
00286 virtual void constrainRotation (Quaternion& , Frame* const);
00287
00289 const Camera* camera() const { return camera_; };
00290
00291 private:
00293 const Camera* const camera_;
00294 };
00295
00296 }
00297
00298 #endif // QGLVIEWER_CONSTRAINT_H