ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
ModelViewerWidget.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 
10 #include <LineSet.h>
11 #include <ecvBBox.h>
12 
13 #include <QtCore>
14 #include <QtOpenGL>
15 
16 #include "ImageViewerWidget.h"
17 #include "MovieGrabberWidget.h"
18 #include "PointViewerWidget.h"
19 #include "base/database.h"
20 #include "base/reconstruction.h"
21 #include "ui/colormaps.h"
22 #include "ui/render_options.h"
23 #include "util/option_manager.h"
24 
25 class ccPointCloud;
26 class ccCameraSensor;
27 class MainWindow;
28 
29 namespace cloudViewer {
30 
31 // Use colmap's colormap types
36 
37 class ModelViewerWidget : public QWidget {
38 public:
39  const float kInitNearPlane = 1.0f;
40  const float kMinNearPlane = 1e-3f;
41  const float kMaxNearPlane = 1e5f;
42  const float kNearPlaneScaleSpeed = 0.02f;
43  const float kFarPlane = 1e5f;
44  const float kInitFocusDistance = 100.0f;
45  const float kMinFocusDistance = 1e-5f;
46  const float kMaxFocusDistance = 1e8f;
47  const float kFieldOfView = 25.0f;
48  const float kFocusSpeed = 2.0f;
49  const float kInitPointSize = 1.0f;
50  const float kMinPointSize = 0.5f;
51  const float kMaxPointSize = 100.0f;
52  const float kPointScaleSpeed = 1.0f;
53  const float kInitImageSize = 0.2f;
54  const float kMinImageSize = 1e-6f;
55  const float kMaxImageSize = 1e3f;
56  const float kImageScaleSpeed = 0.1f;
57  const int kDoubleClickInterval = 250;
58 
59  ModelViewerWidget(QWidget* parent, OptionManager* options, MainWindow* app);
60 
61  void Release();
62 
63  QWidget* getMainWindow();
64 
65  void ReloadReconstruction();
66  void ClearReconstruction();
67 
68  int GetProjectionType() const;
69 
70  // Takes ownwership of the colormap objects.
71  void SetPointColormap(PointColormapBase* colormap);
72  void SetImageColormap(ImageColormapBase* colormap);
73 
74  void UpdateMovieGrabber();
75 
76  float ZoomScale();
77  float AspectRatio() const;
78  void ChangeFocusDistance(const float delta);
79  void ChangePointSize(const float delta);
80  void ChangeCameraSize(const float delta);
81 
82  void ResetView();
83 
85 
86  void SelectObject(ccHObject* entity,
87  unsigned subEntityID,
88  int x,
89  int y,
90  const CCVector3& P);
91  // void SelectObject(const CCVector3& p, int index, const std::string& id);
92  void SelectMoviewGrabberView(const size_t view_idx);
93 
94  QImage GrabImage();
95  void GrabMovie();
96 
97  void update();
98  void StartRender();
99  void EndRender(bool autoZoom = true);
100 
101  void ShowPointInfo(const colmap::point3D_t point3D_id);
102  void ShowImageInfo(const colmap::image_t image_id);
103 
106 
107  float PointSize() const;
108  float ImageSize() const;
109  void SetPointSize(const float point_size, bool autoUpdate = true);
110  void SetImageSize(const float image_size, bool autoUpdate = true);
111 
112  void SetBackgroundColor(const float r, const float g, const float b);
113 
114  // Copy of current scene data that is displayed
115  colmap::Reconstruction* reconstruction = nullptr;
116  std::unordered_map<colmap::camera_t, colmap::Camera> cameras;
117  std::unordered_map<colmap::image_t, colmap::Image> images;
118  std::unordered_map<colmap::point3D_t, colmap::Point3D> points3D;
119  std::vector<colmap::image_t> reg_image_ids;
120 
122 
123 private:
124  void SetupView();
125 
126  void Upload();
127  void UploadPointData(const bool selection_mode = false);
128  void UploadPointConnectionData();
129  void UploadImageData(const bool selection_mode = false);
130  void UploadImageConnectionData();
131  void UploadMovieGrabberData();
132 
133  void drawPointCloud(ccPointCloud* cloud);
134  void resetPointCloud(ccPointCloud* cloud);
135  void drawLines(geometry::LineSet& lineset);
136  void resetLines(geometry::LineSet& lineset);
137  void drawCameraSensors(std::vector<ccCameraSensor*>& sensors);
138  void resetCameraSensors(std::vector<ccCameraSensor*>& sensors);
139  void clearSensors(std::vector<ccCameraSensor*>& sensors);
140  void updateSensors(std::vector<ccCameraSensor*>& sensors,
141  const std::vector<colmap::image_t>& image_ids);
142  ccHObject* getSelectedCamera(colmap::image_t selected_id);
143 
144  OptionManager* options_;
145 
146  PointViewerWidget* point_viewer_widget_;
147  DatabaseImageViewerWidget* image_viewer_widget_;
148  MovieGrabberWidget* movie_grabber_widget_;
149 
150  std::unique_ptr<PointColormapBase> point_colormap_;
151  std::unique_ptr<ImageColormapBase> image_colormap_;
152 
153  float focus_distance_;
154 
155  std::vector<std::pair<std::size_t, char>> selection_buffer_;
156  colmap::image_t selected_image_id_;
157  colmap::point3D_t selected_point3D_id_;
158  std::size_t selected_movie_grabber_view_;
159 
160  MainWindow* app_;
161 
162  // for visualization
163  ccPointCloud* cloud_sparse_;
164  ccBBox bbox_;
165 
166  geometry::LineSet point_line_data_;
167  geometry::LineSet image_line_data_;
168  std::vector<ccCameraSensor*> sensors_;
169 
170  ccHObject* main_sensors_;
171 
172  geometry::LineSet movie_grabber_path_;
173  std::vector<ccCameraSensor*> movie_grabber_sensors_;
174 
175  // Size of points (dynamic): does not require re-uploading of points.
176  float point_size_;
177  // Size of image models (not dynamic): requires re-uploading of image
178  // models.
179  float image_size_;
180 };
181 
182 } // namespace cloudViewer
Bounding box structure.
Definition: ecvBBox.h:25
Camera (projective) sensor.
Double version of ccGLMatrixTpl.
Definition: ecvGLMatrix.h:56
Hierarchical CLOUDVIEWER Object.
Definition: ecvHObject.h:25
A 3D cloud and its associated features (color, normals, scalar fields, etc.)
void SelectObject(ccHObject *entity, unsigned subEntityID, int x, int y, const CCVector3 &P)
std::vector< colmap::image_t > reg_image_ids
std::unordered_map< colmap::point3D_t, colmap::Point3D > points3D
void ShowImageInfo(const colmap::image_t image_id)
ModelViewerWidget(QWidget *parent, OptionManager *options, MainWindow *app)
void SetImageSize(const float image_size, bool autoUpdate=true)
void SetPointColormap(PointColormapBase *colormap)
void SetPointSize(const float point_size, bool autoUpdate=true)
void ChangeCameraSize(const float delta)
std::unordered_map< colmap::camera_t, colmap::Camera > cameras
void SetImageColormap(ImageColormapBase *colormap)
void SetBackgroundColor(const float r, const float g, const float b)
void ShowPointInfo(const colmap::point3D_t point3D_id)
void ChangePointSize(const float delta)
colmap::Reconstruction * reconstruction
void EndRender(bool autoZoom=true)
void ChangeFocusDistance(const float delta)
std::unordered_map< colmap::image_t, colmap::Image > images
void SelectMoviewGrabberView(const size_t view_idx)
LineSet define a sets of lines in 3D. A typical application is to display the point cloud corresponde...
Definition: LineSet.h:29
Generic file read and write utility for python interface.
colmap::RenderOptions RenderOptions
colmap::ImageColormapBase ImageColormapBase
colmap::OptionManager OptionManager
colmap::PointColormapBase PointColormapBase