Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef QGLVIEWER_CAMERA_H
00024 #define QGLVIEWER_CAMERA_H
00025
00026 #include "manipulatedCameraFrame.h"
00027 #include "keyFrameInterpolator.h"
00028
00029 namespace qglviewer {
00081 class QGLVIEWER_EXPORT Camera : public QObject
00082 {
00083 #ifndef DOXYGEN
00084 friend class ::QGLViewer;
00085 #endif
00086
00087 Q_OBJECT
00088
00089 public:
00090 Camera();
00091 virtual ~Camera();
00092
00093 Camera(const Camera& camera);
00094 Camera& operator=(const Camera& camera);
00095
00096
00102 enum Type { PERSPECTIVE, ORTHOGRAPHIC };
00103
00106 public:
00114 Vec position() const { return frame()->position(); };
00115
00123 Vec upVector() const
00124 {
00125 return frame()->inverseTransformOf(Vec(0.0, 1.0, 0.0));
00126 }
00134 Vec viewDirection() const { return frame()->inverseTransformOf(Vec(0.0, 0.0, -1.0)); };
00135
00142 Vec rightVector() const
00143 {
00144 return frame()->inverseTransformOf(Vec(1.0, 0.0, 0.0));
00145 }
00146
00151 Quaternion orientation() const { return frame()->orientation(); };
00152
00153 void setFromModelViewMatrix(const GLdouble* const modelViewMatrix);
00154 void setFromProjectionMatrix(const float matrix[12]);
00155
00156 public Q_SLOTS:
00158 void setPosition(const Vec& pos) { frame()->setPosition(pos); };
00159 void setOrientation(const Quaternion& q);
00160 void setOrientation(float theta, float phi);
00161 void setUpVector(const Vec& up, bool noMove=true);
00162 void setViewDirection(const Vec& direction);
00164
00165
00168 public Q_SLOTS:
00169 void lookAt(const Vec& target);
00170 void showEntireScene();
00171 void fitSphere(const Vec& center, float radius);
00172 void fitBoundingBox(const Vec& min, const Vec& max);
00173 void fitScreenRegion(const QRect& rectangle);
00174 void centerScene();
00175 void interpolateToZoomOnPixel(const QPoint& pixel);
00176 void interpolateToFitScene();
00177 void interpolateTo(const Frame& fr, float duration);
00179
00180
00183 public:
00196 Type type() const { return type_; };
00197
00208 float fieldOfView() const { return fieldOfView_; };
00209
00217 float horizontalFieldOfView() const { return 2.0 * atan ( tan(fieldOfView()/2.0) * aspectRatio() ); };
00218
00223 float aspectRatio() const { return static_cast<float>(screenWidth_)/static_cast<float>(screenHeight_); };
00228 int screenWidth() const { return screenWidth_; };
00233 int screenHeight() const { return screenHeight_; };
00234 void getViewport(GLint viewport[4]) const;
00235 float pixelGLRatio(const Vec& position) const;
00236
00248 float zNearCoefficient() const { return zNearCoef_; };
00267 float zClippingCoefficient() const { return zClippingCoef_; }
00268
00269 virtual float zNear() const;
00270 virtual float zFar() const;
00271 virtual void getOrthoWidthHeight(GLdouble& halfWidth, GLdouble& halfHeight) const;
00272 void getFrustumPlanesCoefficients(GLdouble coef[6][4]) const;
00273
00274 public Q_SLOTS:
00275 void setType(Type type);
00276
00280 void setFieldOfView(float fov) { fieldOfView_ = fov; setFocusDistance(sceneRadius() / tan(fov/2.0)); };
00281
00287 void setHorizontalFieldOfView(float hfov) { setFieldOfView( 2.0 * atan (tan(hfov / 2.0) / aspectRatio()) ); };
00288
00289 void setFOVToFitScene();
00290
00303 void setAspectRatio(float aspect) { setScreenWidthAndHeight(int(100.0*aspect), 100); };
00304
00305 void setScreenWidthAndHeight(int width, int height);
00307 void setZNearCoefficient(float coef) { zNearCoef_ = coef; };
00309 void setZClippingCoefficient(float coef) { zClippingCoef_ = coef; }
00311
00312
00315 public:
00325 float sceneRadius() const { return sceneRadius_; };
00326
00338 Vec sceneCenter() const { return sceneCenter_; };
00339 float distanceToSceneCenter() const;
00340
00341 public Q_SLOTS:
00342 void setSceneRadius(float radius);
00343 void setSceneCenter(const Vec& center);
00344 bool setSceneCenterFromPixel(const QPoint& pixel);
00345 void setSceneBoundingBox(const Vec& min, const Vec& max);
00347
00348
00351 public Q_SLOTS:
00352 void setRevolveAroundPoint(const Vec& rap);
00353 bool setRevolveAroundPointFromPixel(const QPoint& pixel);
00354
00355 public:
00361 Vec revolveAroundPoint() const { return frame()->revolveAroundPoint(); };
00363
00364
00367 public:
00372 ManipulatedCameraFrame* frame() const { return frame_; };
00373 public Q_SLOTS:
00374 void setFrame(ManipulatedCameraFrame* const mcf);
00376
00377
00380 public:
00381 KeyFrameInterpolator* keyFrameInterpolator(int i) const;
00382
00383 public Q_SLOTS:
00384 void setKeyFrameInterpolator(int i, KeyFrameInterpolator* const kfi);
00385
00386 virtual void addKeyFrameToPath(int i);
00387 virtual void playPath(int i);
00388 virtual void deletePath(int i);
00389 virtual void resetPath(int i);
00390 virtual void drawAllPaths();
00392
00393
00396 public:
00397 virtual void loadProjectionMatrix(bool reset=true) const;
00398 virtual void loadModelViewMatrix(bool reset=true) const;
00399 void computeProjectionMatrix() const;
00400 void computeModelViewMatrix() const;
00401
00402 virtual void loadProjectionMatrixStereo(bool leftBuffer=true) const;
00403 virtual void loadModelViewMatrixStereo(bool leftBuffer=true) const;
00404
00405 void getProjectionMatrix(GLdouble m[16]) const;
00406 void getModelViewMatrix(GLdouble m[16]) const;
00407 void getModelViewProjectionMatrix(GLdouble m[16]) const;
00408
00409 #ifndef DOXYGEN
00410
00411 void getProjectionMatrix(GLfloat m[16]) const;
00412 void getModelViewMatrix(GLfloat m[16]) const;
00413 #endif
00414
00415
00416
00419 #ifndef DOXYGEN
00420 static void drawCamera(float scale=1.0, float aspectRatio=1.33, float fieldOfView=M_PI/4.0);
00421 #endif
00422 virtual void draw(bool drawFarPlane=true, float scale=1.0) const;
00424
00425
00428 public:
00435 Vec cameraCoordinatesOf(const Vec& src) const { return frame()->coordinatesOf(src); };
00440 Vec worldCoordinatesOf(const Vec& src) const { return frame()->inverseCoordinatesOf(src); };
00441 void getCameraCoordinatesOf(const float src[3], float res[3]) const;
00442 void getWorldCoordinatesOf(const float src[3], float res[3]) const;
00444
00445
00448 public:
00449 Vec projectedCoordinatesOf(const Vec& src, const Frame* frame=NULL) const;
00450 Vec unprojectedCoordinatesOf(const Vec& src, const Frame* frame=NULL) const;
00451 void getProjectedCoordinatesOf(const float src[3], float res[3], const Frame* frame=NULL) const;
00452 void getUnprojectedCoordinatesOf(const float src[3], float res[3], const Frame* frame=NULL) const;
00453 void convertClickToLine(const QPoint& pixel, Vec& orig, Vec& dir) const;
00454 Vec pointUnderPixel(const QPoint& pixel, bool& found) const;
00456
00457
00460 public:
00468 float flySpeed() const { return frame()->flySpeed(); };
00469 public Q_SLOTS:
00473 void setFlySpeed(float speed) { frame()->setFlySpeed(speed); };
00475
00476
00479 public:
00484 float IODistance() const { return IODistance_; };
00485
00493 float physicalDistanceToScreen() const { return physicalScreenWidth() / 2.0f / tan(horizontalFieldOfView() / 2.0); };
00494
00499 float physicalScreenWidth() const { return physicalScreenWidth_; };
00500
00511 float focusDistance() const { return focusDistance_; };
00512 public Q_SLOTS:
00514 void setIODistance(float distance) { IODistance_ = distance; };
00515
00516 #ifndef DOXYGEN
00517
00518 void setPhysicalDistanceToScreen(float distance) { Q_UNUSED(distance); qWarning("setPhysicalDistanceToScreen is deprecated, use setPhysicalScreenWidth instead"); };
00519 #endif
00520
00522 void setPhysicalScreenWidth(float width) { physicalScreenWidth_ = width; };
00523
00525 void setFocusDistance(float distance) { focusDistance_ = distance; };
00527
00528
00531 public:
00532 virtual QDomElement domElement(const QString& name, QDomDocument& document) const;
00533 public Q_SLOTS:
00534 virtual void initFromDOMElement(const QDomElement& element);
00536
00537
00538 private:
00539
00540 ManipulatedCameraFrame* frame_;
00541
00542
00543 int screenWidth_, screenHeight_;
00544 float fieldOfView_;
00545 Vec sceneCenter_;
00546 float sceneRadius_;
00547 float zNearCoef_;
00548 float zClippingCoef_;
00549 float orthoCoef_;
00550 Type type_;
00551 mutable GLdouble modelViewMatrix_[16];
00552 mutable GLdouble projectionMatrix_[16];
00553
00554
00555 float IODistance_;
00556 float focusDistance_;
00557 float physicalScreenWidth_;
00558
00559
00560 QMap<int, KeyFrameInterpolator*> kfi_;
00561 KeyFrameInterpolator* interpolationKfi_;
00562 };
00563
00564 }
00565
00566 #endif // QGLVIEWER_CAMERA_H