camera.h
Go to the documentation of this file.
1 /****************************************************************************
2 
3  Copyright (C) 2002-2014 Gilles Debunne. All rights reserved.
4 
5  This file is part of the QGLViewer library version 2.6.3.
6 
7  http://www.libqglviewer.com - contact@libqglviewer.com
8 
9  This file may be used under the terms of the GNU General Public License
10  versions 2.0 or 3.0 as published by the Free Software Foundation and
11  appearing in the LICENSE file included in the packaging of this file.
12  In addition, as a special exception, Gilles Debunne gives you certain
13  additional rights, described in the file GPL_EXCEPTION in this package.
14 
15  libQGLViewer uses dual licensing. Commercial/proprietary software must
16  purchase a libQGLViewer Commercial License.
17 
18  This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
19  WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
20 
21 *****************************************************************************/
22 
23 #ifndef QGLVIEWER_CAMERA_H
24 #define QGLVIEWER_CAMERA_H
25 
26 #include "keyFrameInterpolator.h"
27 class QGLViewer;
28 
29 namespace qglviewer {
30 
32 
84 class QGLVIEWER_EXPORT Camera : public QObject
85 {
86 #ifndef DOXYGEN
87  friend class ::QGLViewer;
88 #endif
89 
90  Q_OBJECT
91 
92 public:
93  Camera();
94  virtual ~Camera();
95 
96  Camera(const Camera& camera);
97  Camera& operator=(const Camera& camera);
98 
99 
105  enum Type { PERSPECTIVE, ORTHOGRAPHIC };
106 
109 public:
110  Vec position() const;
111  Vec upVector() const;
112  Vec viewDirection() const;
113  Vec rightVector() const;
114  Quaternion orientation() const;
115 
116  void setFromModelViewMatrix(const GLdouble* const modelViewMatrix);
117  void setFromProjectionMatrix(const qreal matrix[12]);
118 
119 public Q_SLOTS:
120  void setPosition(const Vec& pos);
121  void setOrientation(const Quaternion& q);
122  void setOrientation(qreal theta, qreal phi);
123  void setUpVector(const Vec& up, bool noMove=true);
124  void setViewDirection(const Vec& direction);
126 
127 
130 public Q_SLOTS:
131  void lookAt(const Vec& target);
132  void showEntireScene();
133  void fitSphere(const Vec& center, qreal radius);
134  void fitBoundingBox(const Vec& min, const Vec& max);
135  void fitScreenRegion(const QRect& rectangle);
136  void centerScene();
137  void interpolateToZoomOnPixel(const QPoint& pixel);
138  void interpolateToFitScene();
139  void interpolateTo(const Frame& fr, qreal duration);
141 
142 
145 public:
158  Type type() const { return type_; }
159 
170  qreal fieldOfView() const { return fieldOfView_; }
171 
179  qreal horizontalFieldOfView() const { return 2.0 * atan ( tan(fieldOfView()/2.0) * aspectRatio() ); }
180 
185  qreal aspectRatio() const { return screenWidth_ / static_cast<qreal>(screenHeight_); }
190  int screenWidth() const { return screenWidth_; }
195  int screenHeight() const { return screenHeight_; }
196  void getViewport(GLint viewport[4]) const;
197  qreal pixelGLRatio(const Vec& position) const;
198 
210  qreal zNearCoefficient() const { return zNearCoef_; }
229  qreal zClippingCoefficient() const { return zClippingCoef_; }
230 
231  virtual qreal zNear() const;
232  virtual qreal zFar() const;
233  virtual void getOrthoWidthHeight(GLdouble& halfWidth, GLdouble& halfHeight) const;
234  void getFrustumPlanesCoefficients(GLdouble coef[6][4]) const;
235 
236 public Q_SLOTS:
237  void setType(Type type);
238 
239  void setFieldOfView(qreal fov);
240 
246  void setHorizontalFieldOfView(qreal hfov) { setFieldOfView( 2.0 * atan (tan(hfov / 2.0) / aspectRatio()) ); }
247 
248  void setFOVToFitScene();
249 
262  void setAspectRatio(qreal aspect) { setScreenWidthAndHeight(int(100.0*aspect), 100); }
263 
264  void setScreenWidthAndHeight(int width, int height);
266  void setZNearCoefficient(qreal coef) { zNearCoef_ = coef; projectionMatrixIsUpToDate_ = false; }
268  void setZClippingCoefficient(qreal coef) { zClippingCoef_ = coef; projectionMatrixIsUpToDate_ = false; }
270 
271 
274 public:
284  qreal sceneRadius() const { return sceneRadius_; }
285 
297  Vec sceneCenter() const { return sceneCenter_; }
298  qreal distanceToSceneCenter() const;
299 
300 public Q_SLOTS:
301  void setSceneRadius(qreal radius);
302  void setSceneCenter(const Vec& center);
303  bool setSceneCenterFromPixel(const QPoint& pixel);
304  void setSceneBoundingBox(const Vec& min, const Vec& max);
306 
307 
310 public Q_SLOTS:
311  void setPivotPoint(const Vec& point);
312  bool setPivotPointFromPixel(const QPoint& pixel);
313 
314 public:
315  Vec pivotPoint() const;
316 
317 #ifndef DOXYGEN
318 public Q_SLOTS:
319  void setRevolveAroundPoint(const Vec& point);
320  bool setRevolveAroundPointFromPixel(const QPoint& pixel);
321 public:
322  Vec revolveAroundPoint() const;
323 #endif
324 
325 
326 
329 public:
334  ManipulatedCameraFrame* frame() const { return frame_; }
335 public Q_SLOTS:
336  void setFrame(ManipulatedCameraFrame* const mcf);
338 
339 
342 public:
343  KeyFrameInterpolator* keyFrameInterpolator(unsigned int i) const;
344 
345 public Q_SLOTS:
346  void setKeyFrameInterpolator(unsigned int i, KeyFrameInterpolator* const kfi);
347 
348  virtual void addKeyFrameToPath(unsigned int i);
349  virtual void playPath(unsigned int i);
350  virtual void deletePath(unsigned int i);
351  virtual void resetPath(unsigned int i);
352  virtual void drawAllPaths();
354 
355 
358 public:
359  virtual void loadProjectionMatrix(bool reset=true) const;
360  virtual void loadModelViewMatrix(bool reset=true) const;
361  void computeProjectionMatrix() const;
362  void computeModelViewMatrix() const;
363 
364  virtual void loadProjectionMatrixStereo(bool leftBuffer=true) const;
365  virtual void loadModelViewMatrixStereo(bool leftBuffer=true) const;
366 
367  void getProjectionMatrix(GLfloat m[16]) const;
368  void getProjectionMatrix(GLdouble m[16]) const;
369 
370  void getModelViewMatrix(GLfloat m[16]) const;
371  void getModelViewMatrix(GLdouble m[16]) const;
372 
373  void getModelViewProjectionMatrix(GLfloat m[16]) const;
374  void getModelViewProjectionMatrix(GLdouble m[16]) const;
376 
377 
380 #ifndef DOXYGEN
381  static void drawCamera(qreal scale=1.0, qreal aspectRatio=1.33, qreal fieldOfView=qreal(M_PI)/4.0);
382 #endif
383  virtual void draw(bool drawFarPlane=true, qreal scale=1.0) const;
385 
386 
389 public:
390  Vec cameraCoordinatesOf(const Vec& src) const;
391  Vec worldCoordinatesOf(const Vec& src) const;
392  void getCameraCoordinatesOf(const qreal src[3], qreal res[3]) const;
393  void getWorldCoordinatesOf(const qreal src[3], qreal res[3]) const;
395 
396 
399 public:
400  Vec projectedCoordinatesOf(const Vec& src, const Frame* frame=NULL) const;
401  Vec unprojectedCoordinatesOf(const Vec& src, const Frame* frame=NULL) const;
402  void getProjectedCoordinatesOf(const qreal src[3], qreal res[3], const Frame* frame=NULL) const;
403  void getUnprojectedCoordinatesOf(const qreal src[3], qreal res[3], const Frame* frame=NULL) const;
404  void convertClickToLine(const QPoint& pixel, Vec& orig, Vec& dir) const;
405  Vec pointUnderPixel(const QPoint& pixel, bool& found) const;
407 
408 
411 public:
412  qreal flySpeed() const;
413 public Q_SLOTS:
414  void setFlySpeed(qreal speed);
416 
417 
420 public:
425  qreal IODistance() const { return IODistance_; }
426 
434  qreal physicalDistanceToScreen() const { return physicalScreenWidth() / 2.0 / tan(horizontalFieldOfView() / 2.0); }
435 
440  qreal physicalScreenWidth() const { return physicalScreenWidth_; }
441 
452  qreal focusDistance() const { return focusDistance_; }
453 public Q_SLOTS:
455  void setIODistance(qreal distance) { IODistance_ = distance; }
456 
457 #ifndef DOXYGEN
458 
459  void setPhysicalDistanceToScreen(qreal distance) { Q_UNUSED(distance); qWarning("setPhysicalDistanceToScreen is deprecated, use setPhysicalScreenWidth instead"); }
460 #endif
461 
463  void setPhysicalScreenWidth(qreal width) { physicalScreenWidth_ = width; }
464 
466  void setFocusDistance(qreal distance) { focusDistance_ = distance; }
468 
469 
472 public:
473  virtual QDomElement domElement(const QString& name, QDomDocument& document) const;
474 public Q_SLOTS:
475  virtual void initFromDOMElement(const QDomElement& element);
477 
478 
479 private Q_SLOTS:
480  void onFrameModified();
481 
482 private:
483  // F r a m e
485 
486  // C a m e r a p a r a m e t e r s
487  int screenWidth_, screenHeight_; // size of the window, in pixels
488  qreal fieldOfView_; // in radians
490  qreal sceneRadius_; // OpenGL units
491  qreal zNearCoef_;
493  qreal orthoCoef_;
494  Type type_; // PERSPECTIVE or ORTHOGRAPHIC
495  mutable GLdouble modelViewMatrix_[16]; // Buffered model view matrix.
497  mutable GLdouble projectionMatrix_[16]; // Buffered projection matrix.
499 
500  // S t e r e o p a r a m e t e r s
501  qreal IODistance_; // inter-ocular distance, in meters
502  qreal focusDistance_; // in scene units
503  qreal physicalScreenWidth_; // in meters
504 
505  // P o i n t s o f V i e w s a n d K e y F r a m e s
506  QMap<unsigned int, KeyFrameInterpolator*> kfi_;
508 };
509 
510 } // namespace qglviewer
511 
512 #endif // QGLVIEWER_CAMERA_H
void setZClippingCoefficient(qreal coef)
Definition: camera.h:268
A keyFrame Catmull-Rom Frame interpolator.
qreal aspectRatio() const
Definition: camera.h:185
The ManipulatedCameraFrame class represents a ManipulatedFrame with Camera specific mouse bindings...
void setAspectRatio(qreal aspect)
Definition: camera.h:262
qreal fieldOfView() const
Definition: camera.h:170
void setIODistance(qreal distance)
Definition: camera.h:455
qreal zNearCoef_
Definition: camera.h:491
qreal physicalScreenWidth_
Definition: camera.h:503
#define M_PI
qreal physicalDistanceToScreen() const
Definition: camera.h:434
int screenWidth() const
Definition: camera.h:190
qreal orthoCoef_
Definition: camera.h:493
#define QGLVIEWER_EXPORT
qreal horizontalFieldOfView() const
Definition: camera.h:179
Type type() const
Definition: camera.h:158
ManipulatedCameraFrame * frame() const
Definition: camera.h:334
qreal sceneRadius() const
Definition: camera.h:284
The Vec class represents 3D positions and 3D vectors.
Definition: vec.h:65
ManipulatedCameraFrame * frame_
Definition: camera.h:484
qreal zNearCoefficient() const
Definition: camera.h:210
KeyFrameInterpolator * interpolationKfi_
Definition: camera.h:507
qreal fieldOfView_
Definition: camera.h:488
QMap< unsigned int, KeyFrameInterpolator * > kfi_
Definition: camera.h:506
bool modelViewMatrixIsUpToDate_
Definition: camera.h:496
qreal focusDistance() const
Definition: camera.h:452
void setPhysicalDistanceToScreen(qreal distance)
Definition: camera.h:459
void setZNearCoefficient(qreal coef)
Definition: camera.h:266
void setPhysicalScreenWidth(qreal width)
Definition: camera.h:463
void setHorizontalFieldOfView(qreal hfov)
Definition: camera.h:246
int screenHeight() const
Definition: camera.h:195
qreal zClippingCoef_
Definition: camera.h:492
qreal physicalScreenWidth() const
Definition: camera.h:440
A versatile 3D OpenGL viewer based on QGLWidget.
Definition: qglviewer.h:62
A perspective or orthographic camera.
Definition: camera.h:84
The Quaternion class represents 3D rotations and orientations.
Definition: quaternion.h:66
qreal IODistance_
Definition: camera.h:501
qreal IODistance() const
Definition: camera.h:425
void setFocusDistance(qreal distance)
Definition: camera.h:466
The Frame class represents a coordinate system, defined by a position and an orientation.
Definition: frame.h:121
bool projectionMatrixIsUpToDate_
Definition: camera.h:498
qreal sceneRadius_
Definition: camera.h:490
qreal zClippingCoefficient() const
Definition: camera.h:229
Vec sceneCenter() const
Definition: camera.h:297
static void drawCamera(qreal scale)
qreal focusDistance_
Definition: camera.h:502


octovis
Author(s): Kai M. Wurm , Armin Hornung
autogenerated on Wed Jun 5 2019 19:26:39