23 #ifndef QGLVIEWER_CAMERA_H
24 #define QGLVIEWER_CAMERA_H
26 #include "keyFrameInterpolator.h"
31 class ManipulatedCameraFrame;
84 class QGLVIEWER_EXPORT
Camera :
public QObject
87 friend class ::QGLViewer;
105 enum Type { PERSPECTIVE, ORTHOGRAPHIC };
110 Vec position()
const;
111 Vec upVector()
const;
112 Vec viewDirection()
const;
113 Vec rightVector()
const;
116 void setFromModelViewMatrix(
const GLdouble*
const modelViewMatrix);
117 void setFromProjectionMatrix(
const float matrix[12]);
120 void setPosition(
const Vec& pos);
122 void setOrientation(
float theta,
float phi);
123 void setUpVector(
const Vec& up,
bool noMove=
true);
124 void setViewDirection(
const Vec& direction);
131 void lookAt(
const Vec& target);
132 void showEntireScene();
133 void fitSphere(
const Vec& center,
float radius);
135 void fitScreenRegion(
const QRect& rectangle);
137 void interpolateToZoomOnPixel(
const QPoint& pixel);
138 void interpolateToFitScene();
139 void interpolateTo(
const Frame& fr,
float duration);
185 float aspectRatio()
const {
return static_cast<float>(screenWidth_)/static_cast<float>(screenHeight_); }
196 void getViewport(GLint viewport[4])
const;
197 float pixelGLRatio(
const Vec& position)
const;
231 virtual float zNear()
const;
232 virtual float zFar()
const;
233 virtual void getOrthoWidthHeight(GLdouble& halfWidth, GLdouble& halfHeight)
const;
234 void getFrustumPlanesCoefficients(GLdouble coef[6][4])
const;
237 void setType(Type type);
239 void setFieldOfView(
float fov);
248 void setFOVToFitScene();
262 void setAspectRatio(
float aspect) { setScreenWidthAndHeight(
int(100.0*aspect), 100); }
264 void setScreenWidthAndHeight(
int width,
int height);
298 float distanceToSceneCenter()
const;
301 void setSceneRadius(
float radius);
302 void setSceneCenter(
const Vec& center);
303 bool setSceneCenterFromPixel(
const QPoint& pixel);
304 void setSceneBoundingBox(
const Vec&
min,
const Vec&
max);
311 void setPivotPoint(
const Vec& point);
312 bool setPivotPointFromPixel(
const QPoint& pixel);
315 Vec pivotPoint()
const;
319 void setRevolveAroundPoint(
const Vec& point);
320 bool setRevolveAroundPointFromPixel(
const QPoint& pixel);
322 Vec revolveAroundPoint()
const;
348 virtual void addKeyFrameToPath(
int i);
349 virtual void playPath(
int i);
350 virtual void deletePath(
int i);
351 virtual void resetPath(
int i);
352 virtual void drawAllPaths();
359 virtual void loadProjectionMatrix(
bool reset=
true)
const;
360 virtual void loadModelViewMatrix(
bool reset=
true)
const;
361 void computeProjectionMatrix()
const;
362 void computeModelViewMatrix()
const;
364 virtual void loadProjectionMatrixStereo(
bool leftBuffer=
true)
const;
365 virtual void loadModelViewMatrixStereo(
bool leftBuffer=
true)
const;
367 void getProjectionMatrix(GLfloat m[16])
const;
368 void getProjectionMatrix(GLdouble m[16])
const;
370 void getModelViewMatrix(GLfloat m[16])
const;
371 void getModelViewMatrix(GLdouble m[16])
const;
373 void getModelViewProjectionMatrix(GLfloat m[16])
const;
374 void getModelViewProjectionMatrix(GLdouble m[16])
const;
381 static void drawCamera(
float scale=1.0,
float aspectRatio=1.33,
float fieldOfView=M_PI/4.0);
383 virtual void draw(
bool drawFarPlane=
true,
float scale=1.0)
const;
390 Vec cameraCoordinatesOf(
const Vec& src)
const;
391 Vec worldCoordinatesOf(
const Vec& src)
const;
392 void getCameraCoordinatesOf(
const float src[3],
float res[3])
const;
393 void getWorldCoordinatesOf(
const float src[3],
float res[3])
const;
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 float src[3],
float res[3],
const Frame* frame=NULL)
const;
403 void getUnprojectedCoordinatesOf(
const float src[3],
float 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;
412 float flySpeed()
const;
414 void setFlySpeed(
float speed);
459 void setPhysicalDistanceToScreen(
float distance) { Q_UNUSED(distance); qWarning(
"setPhysicalDistanceToScreen is deprecated, use setPhysicalScreenWidth instead"); }
473 virtual QDomElement domElement(
const QString& name, QDomDocument& document)
const;
475 virtual void initFromDOMElement(
const QDomElement& element);
480 void onFrameModified();
487 int screenWidth_, screenHeight_;
492 float zClippingCoef_;
495 mutable GLdouble modelViewMatrix_[16];
496 mutable bool modelViewMatrixIsUpToDate_;
497 mutable GLdouble projectionMatrix_[16];
498 mutable bool projectionMatrixIsUpToDate_;
502 float focusDistance_;
503 float physicalScreenWidth_;
506 QMap<int, KeyFrameInterpolator*> kfi_;
512 #endif // QGLVIEWER_CAMERA_H