Trackball.h
上传用户:kellyonhid
上传日期:2013-10-12
资源大小:932k
文件大小:3k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. //############################################################
  2. // Trackball.h
  3. // Kari Pulli
  4. // 10/22/95
  5. //############################################################
  6. #ifndef _Trackball_h_
  7. #define _Trackball_h_
  8. #ifdef WIN32
  9. # include "winGLdecs.h"
  10. #endif
  11. #include <GL/gl.h>
  12. #include <GL/glu.h>
  13. #include "TbObj.h"
  14. #include "Xform.h"
  15. #include "Pnt3.h"
  16. typedef enum {
  17.   CONSTRAIN_NONE, CONSTRAIN_X, CONSTRAIN_Y, CONSTRAIN_Z
  18. } TbConstraint;
  19. class Trackball {
  20. private:
  21.   float W; // window width
  22.   float H; // window height
  23.   float lastQuat[4], currQuat[4];
  24.   int beginx;
  25.   int beginy;
  26.   int begint;
  27.   int spinning;
  28.   int panning;
  29.   int zooming;
  30.   int rotating;
  31.   Pnt3 c,o,u,v,z,trans,up;
  32.   float d;
  33.   float znear, zfar, field_of_view, radius;
  34.   float oblique_camera_offset_x, oblique_camera_offset_y;
  35.   TbObj* lastTarget;
  36.   TbConstraint constraint;
  37.   bool  orthographic;
  38.   float orthoHeight;
  39.   bool  spinning_enabled;
  40.   float transScale;
  41.   Pnt3 transScaleReference;
  42.   void getBounds (float& left, float& right, float& top, float& bottom);
  43.   void setPerspXform(void);
  44.   void setOrthoXform(void);
  45.   void resetAxes(void);
  46.   void enforceZlimits(void);
  47.   void resetTransScale(void);
  48.   //bool bUndoable;
  49.   //Xform<float> undoPosition;
  50. public:
  51.   Trackball(void);
  52.   void  setSize(int w, int h);
  53.   void  setup(float c[3], float o[3], float up[3],
  54.       float r, float fov=45.0,
  55.       float oblique_x = 0, float oblique_y = 0);
  56.   void  resetXform(void);
  57.   void  newRotationCenter(float o[3], TbObj* target = NULL);
  58.   void  changeFOV(float fov);
  59.   float getFOV (void);
  60.   void  setObliqueCamera(float x, float y);
  61.   void  setClippingPlanes (Pnt3 bb_ctr, float bb_r);
  62.   void  pressButton(int button, int up, int x, int y, int t, 
  63.     TbObj* target = NULL);
  64.   void  move(int x, int y, int t, TbObj* target = NULL);
  65.   void  setTransScale (const Pnt3& clickPt = Pnt3(0,0,0));
  66.   void  getXform(float m[4][4], float t[3]);
  67.   void  getXform(float quat[4], float t[3]);
  68.   void  applyXform(int bReinitMatrix = 1);
  69.   void  reapplyXform(int bReinitMatrix = 1);
  70.   void  getState (Pnt3& c, Pnt3& o, Pnt3& t, float q[4],
  71.      float& fov, float &oblique_x, float &oblique_y);
  72.   void  setState (Pnt3& t, float q[4]);
  73.   void  enable_spinning(void);
  74.   void  disable_spinning(void);
  75.   void  spin(void);
  76.   void  stop(void);
  77.   bool  isSpinning (void);
  78.   bool  isManipulating (void);
  79.   bool  isRotating (void) const { return rotating; }
  80.   bool  isPanning  (void) const { return panning; }
  81.   bool  isZooming  (void) const { return zooming; }
  82.   void  getProjection (float &pFov, float &pAsp_rat, 
  83.        float &zNear, float &pFar);
  84.   void  getFrustum (float& left, float& right,
  85.     float& top, float& bottom,
  86.     float& _znear, float& _zfar);
  87.   void  applyProjection (void);
  88.   void  setOrthographic (bool bOrtho);
  89.   bool  getOrthographic (void);
  90.   float getOrthoHeight (void);
  91.   Pnt3  dir(void);
  92.   void  getRotationCenter (float center[3]);
  93.   void  getCameraCenter (float center[3]);
  94.   void  constrainRotation (TbConstraint _constraint);
  95.   void  rotateAroundAxis (const Pnt3& axis, float angle_rads,
  96.   TbObj* target = NULL);
  97.   void  rotateQuat (float quat[4], TbObj* target = NULL);
  98.   Xform<float> getUndoXform();           // only for use with setUndoXform
  99.   void setUndoXform (const Xform<float>& xf);  // only for data from...
  100.   void  translateInEyeCoords (Pnt3& trans, TbObj* target = NULL,
  101.       bool undoable = true);
  102.   void  zoomToRect (int x1, int y1, int x2, int y2);
  103. };
  104. #endif //_Trackball_h_