ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
ViewControl.h
Go to the documentation of this file.
1 // ----------------------------------------------------------------------------
2 // - CloudViewer: www.cloudViewer.org -
3 // ----------------------------------------------------------------------------
4 // Copyright (c) 2018-2024 www.cloudViewer.org
5 // SPDX-License-Identifier: MIT
6 // ----------------------------------------------------------------------------
7 
8 #pragma once
9 // clang-format off
10 #include "visualization/utility/GLHelper.h" // must include first
11 // clang-format on
12 #include <ecvBBox.h>
13 #include <ecvHObject.h>
14 #include <ecvOrientedBBox.h>
15 
18 
19 namespace cloudViewer {
20 namespace visualization {
21 
25 class ViewControl {
26 public:
27  static const double FIELD_OF_VIEW_MAX;
28  static const double FIELD_OF_VIEW_MIN;
29  static const double FIELD_OF_VIEW_DEFAULT;
30  static const double FIELD_OF_VIEW_STEP;
31 
32  static const double ZOOM_DEFAULT;
33  static const double ZOOM_MIN;
34  static const double ZOOM_MAX;
35  static const double ZOOM_STEP;
36 
37  static const double ROTATION_RADIAN_PER_PIXEL;
38 
42  };
43 
44 public:
45  virtual ~ViewControl() {}
46 
50  void SetViewMatrices(
51  const Eigen::Matrix4d &model_matrix = Eigen::Matrix4d::Identity());
52 
54  bool ConvertToViewParameters(ViewParameters &status) const;
55  bool ConvertFromViewParameters(const ViewParameters &status);
56 
57  void SetZoom(const double zoom);
58  void SetUp(const Eigen::Vector3d &up);
59  void SetFront(const Eigen::Vector3d &front);
60  void SetLookat(const Eigen::Vector3d &lookat);
61 
68 
76  const camera::PinholeCameraParameters &parameters,
77  bool allow_arbitrary = false);
78 
81  virtual void Reset();
85  virtual void ChangeFieldOfView(double step);
86  virtual void ChangeWindowSize(int width, int height);
87 
91  virtual void Scale(double scale);
92 
102  virtual void Rotate(double x, double y, double xo = 0.0, double yo = 0.0);
103 
113  virtual void Translate(double x,
114  double y,
115  double xo = 0.0,
116  double yo = 0.0);
117 
118  virtual void CameraLocalTranslate(double forward, double right, double up);
119  virtual void CameraLocalRotate(double x,
120  double y,
121  double xo = 0.0,
122  double yo = 0.0);
123  virtual void ResetCameraLocalRotate();
124 
125  // Function to process rolling
129  virtual void Roll(double x);
130 
131  const ccBBox &GetBoundingBox() const { return bounding_box_; }
132 
134 
135  void FitInGeometry(const ccHObject &geometry) {
136  if (geometry.isKindOf(CV_TYPES::POINT_CLOUD) ||
137  geometry.isKindOf(CV_TYPES::MESH) ||
138  geometry.isKindOf(CV_TYPES::MESH_BASE) ||
139  geometry.isKindOf(CV_TYPES::LINESET) ||
140  geometry.isKindOf(CV_TYPES::POLY_LINE) ||
141  geometry.isKindOf(CV_TYPES::FACET) ||
142  geometry.isKindOf(CV_TYPES::POINT_OCTREE2) ||
143  geometry.isKindOf(CV_TYPES::VOXEL_GRID) ||
144  geometry.isKindOf(CV_TYPES::RGBD_IMAGE) ||
145  geometry.isKindOf(CV_TYPES::IMAGE2) ||
146  geometry.isKindOf(CV_TYPES::BBOX) ||
147  geometry.isKindOf(CV_TYPES::ORIENTED_BBOX)) {
148  bounding_box_ += (const_cast<ccHObject &>(geometry))
150  }
152  }
153 
155  double GetFieldOfView() const { return field_of_view_; }
158  return projection_matrix_;
159  }
162  gl_util::GLVector3f GetEye() const { return eye_.cast<GLfloat>(); }
163  gl_util::GLVector3f GetLookat() const { return lookat_.cast<GLfloat>(); }
164  gl_util::GLVector3f GetUp() const { return up_.cast<GLfloat>(); }
165  gl_util::GLVector3f GetFront() const { return front_.cast<GLfloat>(); }
166  gl_util::GLVector3f GetRight() const { return right_.cast<GLfloat>(); }
167  int GetWindowWidth() const { return window_width_; }
168  int GetWindowHeight() const { return window_height_; }
169  double GetZNear() const { return z_near_; }
170  double GetZFar() const { return z_far_; }
171 
176  void SetConstantZNear(double z_near) { constant_z_near_ = z_near; }
181  void SetConstantZFar(double z_far) { constant_z_far_ = z_far; }
190 
191 protected:
192  int window_width_ = 0;
193  int window_height_ = 0;
195  Eigen::Vector3d eye_;
196  Eigen::Vector3d lookat_;
197  Eigen::Vector3d up_;
198  Eigen::Vector3d front_;
199  Eigen::Vector3d right_;
200  double distance_;
202  double zoom_;
203  double view_ratio_;
204  double aspect_;
205  double z_near_;
206  double z_far_;
207  double constant_z_near_ = -1;
208  double constant_z_far_ = -1;
213 
214  Eigen::Vector3d start_local_rotate_up_;
215  Eigen::Vector3d start_local_rotate_right_;
216  Eigen::Vector3d start_local_rotate_front_;
217  Eigen::Vector3d start_local_rotate_eye_;
218  Eigen::Vector3d start_local_rotate_lookat_;
221 };
222 
223 } // namespace visualization
224 } // namespace cloudViewer
int width
int height
Bounding box structure.
Definition: ecvBBox.h:25
virtual ccBBox GetAxisAlignedBoundingBox() const override
Returns an axis-aligned bounding box of the geometry.
Definition: ecvBBox.h:91
Hierarchical CLOUDVIEWER Object.
Definition: ecvHObject.h:25
bool isKindOf(CV_CLASS_ENUM type) const
Definition: ecvObject.h:128
void clear()
Resets the bounding box.
Definition: BoundingBox.h:125
Contains both intrinsic and extrinsic pinhole camera parameters.
View controller for visualizer.
Definition: ViewControl.h:25
double GetFieldOfView() const
Function to get field of view.
Definition: ViewControl.h:155
gl_util::GLMatrix4f GetViewMatrix() const
Definition: ViewControl.h:160
static const double FIELD_OF_VIEW_STEP
Definition: ViewControl.h:30
bool ConvertFromViewParameters(const ViewParameters &status)
Definition: ViewControl.cpp:97
gl_util::GLMatrix4f GetProjectionMatrix() const
Definition: ViewControl.h:157
ProjectionType GetProjectionType() const
void SetFront(const Eigen::Vector3d &front)
void SetUp(const Eigen::Vector3d &up)
virtual void Translate(double x, double y, double xo=0.0, double yo=0.0)
Function to process translation.
virtual void Rotate(double x, double y, double xo=0.0, double yo=0.0)
Function to process rotation.
gl_util::GLVector3f GetRight() const
Definition: ViewControl.h:166
virtual void CameraLocalTranslate(double forward, double right, double up)
virtual void CameraLocalRotate(double x, double y, double xo=0.0, double yo=0.0)
virtual void ChangeFieldOfView(double step)
virtual void ChangeWindowSize(int width, int height)
bool ConvertFromPinholeCameraParameters(const camera::PinholeCameraParameters &parameters, bool allow_arbitrary=false)
void SetLookat(const Eigen::Vector3d &lookat)
void FitInGeometry(const ccHObject &geometry)
Definition: ViewControl.h:135
virtual void Scale(double scale)
const ccBBox & GetBoundingBox() const
Definition: ViewControl.h:131
gl_util::GLVector3f GetFront() const
Definition: ViewControl.h:165
gl_util::GLVector3f GetLookat() const
Definition: ViewControl.h:163
static const double FIELD_OF_VIEW_DEFAULT
Definition: ViewControl.h:29
void SetViewMatrices(const Eigen::Matrix4d &model_matrix=Eigen::Matrix4d::Identity())
Definition: ViewControl.cpp:38
gl_util::GLMatrix4f GetModelMatrix() const
Definition: ViewControl.h:161
bool ConvertToPinholeCameraParameters(camera::PinholeCameraParameters &parameters)
gl_util::GLMatrix4f GetMVPMatrix() const
Definition: ViewControl.h:156
static const double ROTATION_RADIAN_PER_PIXEL
Definition: ViewControl.h:37
bool ConvertToViewParameters(ViewParameters &status) const
Function to get equivalent view parameters (support orthogonal)
Definition: ViewControl.cpp:86
gl_util::GLVector3f GetUp() const
Definition: ViewControl.h:164
gl_util::GLVector3f GetEye() const
Definition: ViewControl.h:162
@ MESH
Definition: CVTypes.h:105
@ POINT_CLOUD
Definition: CVTypes.h:104
@ MESH_BASE
Definition: CVTypes.h:148
@ VOXEL_GRID
Definition: CVTypes.h:151
@ POLY_LINE
Definition: CVTypes.h:112
@ FACET
Definition: CVTypes.h:109
@ LINESET
Definition: CVTypes.h:152
@ RGBD_IMAGE
Definition: CVTypes.h:158
@ IMAGE2
Definition: CVTypes.h:156
@ POINT_OCTREE2
Definition: CVTypes.h:157
@ BBOX
Definition: CVTypes.h:154
@ ORIENTED_BBOX
Definition: CVTypes.h:155
Eigen::Matrix< float, 4, 4, Eigen::ColMajor > GLMatrix4f
Definition: GLHelper.h:35
Eigen::Matrix< float, 3, 1, Eigen::ColMajor > GLVector3f
Definition: GLHelper.h:33
Generic file read and write utility for python interface.