Easy3D 2.5.3
camera.h
1/********************************************************************
2 * Copyright (C) 2015 Liangliang Nan <liangliang.nan@gmail.com>
3 * https://3d.bk.tudelft.nl/liangliang/
4 *
5 * This file is part of Easy3D. If it is useful in your research/work,
6 * I would be grateful if you show your appreciation by citing it:
7 * ------------------------------------------------------------------
8 * Liangliang Nan.
9 * Easy3D: a lightweight, easy-to-use, and efficient C++ library
10 * for processing and rendering 3D data.
11 * Journal of Open Source Software, 6(64), 3255, 2021.
12 * ------------------------------------------------------------------
13 *
14 * Easy3D is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License Version 3
16 * as published by the Free Software Foundation.
17 *
18 * Easy3D is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU General Public License for more details.
22 *
23 * You should have received a copy of the GNU General Public License
24 * along with this program. If not, see <http://www.gnu.org/licenses/>.
25 ********************************************************************/
26
39#ifndef EASY3D_RENDERER_CAMERA_H
40#define EASY3D_RENDERER_CAMERA_H
41
42
43#include <easy3d/core/types.h>
44#include <easy3d/core/signal.h>
45#include <easy3d/renderer/frame.h>
46
47
48namespace easy3d {
49
50
51 class Viewer;
52 class Frame;
53 class ManipulatedCameraFrame;
54 class KeyFrameInterpolator;
55
115 class Camera
116 {
117 public:
118 Camera();
119 virtual ~Camera();
120
122 Camera(const Camera &camera);
123 Camera &operator=(const Camera &camera);
124
131 enum Type { PERSPECTIVE, ORTHOGRAPHIC };
132
135 public:
136 vec3 position() const;
137 vec3 upVector() const;
138 vec3 viewDirection() const;
139 vec3 rightVector() const;
140 quat orientation() const;
141
142 // -----------------------------------------------------------------
143
150 void set_from_model_view_matrix(const mat4& mv) const;
151
172 // Some useful transformations
173 // - camera position: -transpose(R) * t. Because when transforming from world to camera: P' = R * P + t.
174 // - view direction: transpose(R) * vec3(0, 0, -1), which is actually the negative Z axis of the frame.
175 void set_from_calibration(float fx, float fy, float skew, float cx, float cy,
176 const mat3& R, const vec3& t, bool convert = true);
177
196 void set_from_calibration(const mat34& proj);
197
198 // -----------------------------------------------------------------
199
208 void set_projection_matrix(const mat4& proj);
209
218 void set_modelview_matrix(const mat4& mv);
219
220 // -----------------------------------------------------------------
221
222 public:
223 void setPosition(const vec3 &pos) const;
224 void setOrientation(const quat &q) const;
225 void setOrientation(float theta, float phi) const;
226 void setUpVector(const vec3 &up, bool noMove = true) const;
227 void setViewDirection(const vec3 &direction) const;
229
231 public:
232 void lookAt(const vec3 &target) const;
233 void showEntireScene() const;
234 void fitSphere(const vec3 &center, float radius) const;
235 void fitBoundingBox(const vec3 &min, const vec3 &max) const;
236
245 void fitScreenRegion(int xmin, int ymin, int xmax, int ymax) const;
246 void centerScene() const;
247
248 public:
250 KeyFrameInterpolator *keyframe_interpolator() const { return interpolationKfi_; }
251
253 void interpolateToLookAt(const vec3& point);
257 void interpolateTo(const Frame &frame, float duration);
258
259 public:
267 Type type() const { return type_; }
268
278 float fieldOfView() const { return fieldOfView_; }
279
288 float horizontalFieldOfView() const {
289 return 2.0f * std::atan(std::tan(fieldOfView() / 2.0f) * aspectRatio());
290 }
291
297 float aspectRatio() const {
298 return static_cast<float>(screenWidth_) / static_cast<float>(screenHeight_);
299 }
300
306 int screenWidth() const { return screenWidth_; }
307
313 int screenHeight() const { return screenHeight_; }
314 float pixelGLRatio(const vec3 &position) const;
315
326 float zNearCoefficient() const { return zNearCoef_; }
327
342 float zClippingCoefficient() const { return zClippingCoef_; }
343
344 virtual float zNear() const;
345 virtual float zFar() const;
346 virtual void getOrthoWidthHeight(float &halfWidth, float &halfHeight) const;
347 void getFrustumPlanesCoefficients(float coef[6][4]) const;
349 void getFrustumPlanesCoefficients2(float coef[6][4]) const; // my version
350
351 public:
352 void setType(Type type);
353
354 void setFieldOfView(float fov);
355
361 void setHorizontalFieldOfView(float hfov) {
362 setFieldOfView(2.0f * std::atan(std::tan(hfov / 2.0f) / aspectRatio()));
363 }
364
365 void setFOVToFitScene();
366
376 void setAspectRatio(float aspect) {
377 setScreenWidthAndHeight(int(100.0f * aspect), 100);
378 }
379
380 void setScreenWidthAndHeight(int width, int height);
381
385 void setZNearCoefficient(float coef) {
386 zNearCoef_ = coef;
387 projectionMatrixIsUpToDate_ = false;
388 }
389
393 void setZClippingCoefficient(float coef) {
394 zClippingCoef_ = coef;
395 projectionMatrixIsUpToDate_ = false;
396 }
398
401 public:
408 float sceneRadius() const { return sceneRadius_; }
409
418 vec3 sceneCenter() const { return sceneCenter_; }
419 float distanceToSceneCenter() const;
420
421 public:
422 void setSceneRadius(float radius);
423 void setSceneCenter(const vec3 &center);
424 void setSceneBoundingBox(const vec3 &min, const vec3 &max);
426
427 public:
428 // The camera will move around the pivot point if set.
429 void setPivotPoint(const vec3 &point);
430 vec3 pivotPoint() const;
431
432 public:
438 ManipulatedCameraFrame *frame() const { return frame_; }
439 public:
440 void setFrame(ManipulatedCameraFrame *const mcf);
442
443 public:
446
447 const mat4& projectionMatrix() const;
448 const mat4& modelViewMatrix() const;
450
453 public:
454 vec3 cameraCoordinatesOf(const vec3 &src) const;
455 vec3 worldCoordinatesOf(const vec3 &src) const;
457
460 public:
461 vec3 projectedCoordinatesOf(const vec3 &src, const Frame *frame = nullptr) const;
462 vec3 unprojectedCoordinatesOf(const vec3 &src, const Frame *frame = nullptr) const;
463 void convertClickToLine(int x, int y, vec3 &orig, vec3 &dir) const;
465
466 private:
467 void modified();
468
469 private:
470 // Frame
472
473 // Camera parameters
474 int screenWidth_, screenHeight_; // size of the window, in pixels
475 float fieldOfView_; // in radians
476 vec3 sceneCenter_;
477 float sceneRadius_; // OpenGL units
478 float zNearCoef_;
479 float zClippingCoef_;
480 float orthoCoef_;
481 Type type_; // PERSPECTIVE or ORTHOGRAPHIC
482 mat4 modelViewMatrix_; // Buffered model view matrix.
483 bool modelViewMatrixIsUpToDate_;
484 mat4 projectionMatrix_; // Buffered projection matrix.
485 bool projectionMatrixIsUpToDate_;
486
487 // Key frame interpolation
488 KeyFrameInterpolator* interpolationKfi_;
489
490 public:
493 };
494
495}
496
497#endif // EASY3D_RENDERER_CAMERA_H
A perspective or orthographic camera.
Definition: camera.h:116
void setHorizontalFieldOfView(float hfov)
Sets the horizontalFieldOfView() of the Camera (in radians).
Definition: camera.h:361
void setSceneCenter(const vec3 &center)
Definition: camera.cpp:550
void showEntireScene() const
Definition: camera.cpp:709
virtual void getOrthoWidthHeight(float &halfWidth, float &halfHeight) const
Definition: camera.cpp:332
void setPivotPoint(const vec3 &point)
Definition: camera.cpp:559
float zClippingCoefficient() const
Returns the coefficient used to position the near and far clipping planes.
Definition: camera.h:342
Camera & operator=(const Camera &camera)
Definition: camera.cpp:132
KeyFrameInterpolator * keyframe_interpolator() const
Return the keyframe interpolator.
Definition: camera.h:250
void setOrientation(const quat &q) const
Definition: camera.cpp:869
int screenWidth() const
Returns the width (in pixels) of the Camera screen.
Definition: camera.h:306
mat4 modelViewProjectionMatrix() const
Definition: camera.cpp:510
int screenHeight() const
Returns the height (in pixels) of the Camera screen.
Definition: camera.h:313
Type
Enumerates the two possible types of Camera.
Definition: camera.h:131
void setZNearCoefficient(float coef)
Sets the zNearCoefficient() value.
Definition: camera.h:385
virtual float zFar() const
Definition: camera.cpp:245
void interpolateTo(const Frame &frame, float duration)
Perform keyframe interpolation to frame, done in duration second.
Definition: camera.cpp:691
void setFOVToFitScene()
Definition: camera.cpp:632
void setSceneRadius(float radius)
Definition: camera.cpp:530
void fitSphere(const vec3 &center, float radius) const
Definition: camera.cpp:739
quat orientation() const
Definition: camera.cpp:946
float sceneRadius() const
Returns the radius of the scene observed by the Camera.
Definition: camera.h:408
void interpolateToLookAt(const vec3 &point)
Perform keyframe interpolation to look at point.
Definition: camera.cpp:641
vec3 projectedCoordinatesOf(const vec3 &src, const Frame *frame=nullptr) const
Definition: camera.cpp:1255
vec3 cameraCoordinatesOf(const vec3 &src) const
Definition: camera.cpp:960
void set_modelview_matrix(const mat4 &mv)
Temporally change the modelview matrix.
Definition: camera.cpp:522
float aspectRatio() const
Returns the Camera aspect ratio defined by screenWidth() / screenHeight().
Definition: camera.h:297
const mat4 & projectionMatrix() const
Definition: camera.cpp:476
void setScreenWidthAndHeight(int width, int height)
Definition: camera.cpp:168
vec3 pivotPoint() const
Definition: camera.cpp:978
void convertClickToLine(int x, int y, vec3 &orig, vec3 &dir) const
Definition: camera.cpp:1333
void setFieldOfView(float fov)
Definition: camera.cpp:257
void set_projection_matrix(const mat4 &proj)
Temporally change the projection matrix.
Definition: camera.cpp:517
void setAspectRatio(float aspect)
Defines the Camera aspectRatio().
Definition: camera.h:376
void setType(Type type)
Definition: camera.cpp:272
void lookAt(const vec3 &target) const
Definition: camera.cpp:727
void setZClippingCoefficient(float coef)
Sets the zClippingCoefficient() value.
Definition: camera.h:393
void set_from_calibration(float fx, float fy, float skew, float cx, float cy, const mat3 &R, const vec3 &t, bool convert=true)
Defines the position(), orientation() and fieldOfView() of the camera from calibrated camera intrinsi...
Definition: camera.cpp:995
float zNearCoefficient() const
Returns the coefficient which is used to set zNear() when the Camera is inside the sphere defined by ...
Definition: camera.h:326
void computeModelViewMatrix()
Definition: camera.cpp:415
void setUpVector(const vec3 &up, bool noMove=true) const
Definition: camera.cpp:837
vec3 rightVector() const
Definition: camera.cpp:938
float fieldOfView() const
Returns the vertical field of view of the Camera (in radians).
Definition: camera.h:278
void fitBoundingBox(const vec3 &min, const vec3 &max) const
Definition: camera.cpp:759
vec3 unprojectedCoordinatesOf(const vec3 &src, const Frame *frame=nullptr) const
Definition: camera.cpp:1305
vec3 upVector() const
Definition: camera.cpp:915
Signal frame_modified
A signal indicating the frame has been modified.
Definition: camera.h:492
void setFrame(ManipulatedCameraFrame *const mcf)
Definition: camera.cpp:297
void interpolateToFitScene()
Perform keyframe interpolation to fit the scene bounding box.
Definition: camera.cpp:670
void centerScene() const
Definition: camera.cpp:716
void fitScreenRegion(int xmin, int ymin, int xmax, int ymax) const
Moves the Camera so that the rectangular screen region fits the screen.
Definition: camera.cpp:773
float pixelGLRatio(const vec3 &position) const
Definition: camera.cpp:588
void setViewDirection(const vec3 &direction) const
Definition: camera.cpp:879
Camera()
Definition: camera.cpp:57
void computeProjectionMatrix()
Definition: camera.cpp:361
const mat4 & modelViewMatrix() const
Definition: camera.cpp:498
void getFrustumPlanesCoefficients(float coef[6][4]) const
Definition: camera.cpp:1384
virtual ~Camera()
Definition: camera.cpp:99
vec3 position() const
Definition: camera.cpp:905
virtual float zNear() const
Definition: camera.cpp:215
void set_from_model_view_matrix(const mat4 &mv) const
Sets the Camera's position() and orientation() from an OpenGL ModelView matrix.
Definition: camera.cpp:981
vec3 viewDirection() const
Definition: camera.cpp:926
vec3 worldCoordinatesOf(const vec3 &src) const
Definition: camera.cpp:968
void setPosition(const vec3 &pos) const
Definition: camera.cpp:950
vec3 sceneCenter() const
Returns the position of the scene center, defined in the world coordinate system.
Definition: camera.h:418
Type type() const
Returns the Camera::Type of the Camera. Set by setType(). Mainly used by loadProjectionMatrix().
Definition: camera.h:267
float horizontalFieldOfView() const
Returns the horizontal field of view of the Camera (in radians).
Definition: camera.h:288
float distanceToSceneCenter() const
Definition: camera.cpp:313
void getFrustumPlanesCoefficients2(float coef[6][4]) const
Return the 6 plane equations of the Camera frustum.
Definition: camera.cpp:1473
ManipulatedCameraFrame * frame() const
Returns the ManipulatedFrame attached to the Camera.
Definition: camera.h:438
void setSceneBoundingBox(const vec3 &min, const vec3 &max)
Definition: camera.cpp:542
The Frame class represents a coordinate system, defined by a position and an orientation.
Definition: frame.h:152
A keyframe interpolator for animation generation.
Definition: key_frame_interpolator.h:104
A manipulated frame with camera specific mouse bindings.
Definition: manipulated_camera_frame.h:68
3x3 matrix. Extends Mat with 3D-specific functionality and constructors.
Definition: mat.h:1620
Base class for matrix types.
Definition: mat.h:66
A light-weight implementation of the simple signal-slot mechanism.
Definition: signal.h:56
Definition: collider.cpp:182
FT max()
Function returning maximum representable value for a given type.
FT min()
Function returning minimum representable value for a given type.