ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
EditCameraTool.cpp
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 #include "EditCameraTool.h"
9 
10 // Local
11 #include "PclUtils/PCLVis.h"
12 
13 // CV_CORE_LIB
14 #include <CVLog.h>
15 
16 // CV_DB_LIB
17 #include <ecvDisplayTools.h>
18 
19 // VTK / ParaView Server Manager includes.
20 #include <vtkCamera.h>
21 #include <vtkCollection.h>
22 #include <vtkMath.h>
23 #include <vtkSmartPointer.h>
24 #include <vtkTransform.h>
25 
26 // Qt includes.
27 #include <QDebug>
28 #include <QPointer>
29 #include <QSettings>
30 #include <QString>
31 #include <QToolButton>
32 
33 // STL
34 #include <sstream>
35 #include <string>
36 
37 namespace {
38 void RotateElevation(vtkCamera* camera, double angle) {
39  vtkNew<vtkTransform> transform;
40 
41  double scale = vtkMath::Norm(camera->GetPosition());
42  if (scale <= 0.0) {
43  scale = vtkMath::Norm(camera->GetFocalPoint());
44  if (scale <= 0.0) {
45  scale = 1.0;
46  }
47  }
48  double* temp = camera->GetFocalPoint();
49  camera->SetFocalPoint(temp[0] / scale, temp[1] / scale, temp[2] / scale);
50  temp = camera->GetPosition();
51  camera->SetPosition(temp[0] / scale, temp[1] / scale, temp[2] / scale);
52 
53  double v2[3];
54  // translate to center
55  // we rotate around 0,0,0 rather than the center of rotation
56  transform->Identity();
57 
58  // elevation
59  camera->OrthogonalizeViewUp();
60  double* viewUp = camera->GetViewUp();
61  vtkMath::Cross(camera->GetDirectionOfProjection(), viewUp, v2);
62  transform->RotateWXYZ(-angle, v2[0], v2[1], v2[2]);
63 
64  // translate back
65  // we are already at 0,0,0
66 
67  camera->ApplyTransform(transform.GetPointer());
68  camera->OrthogonalizeViewUp();
69 
70  // For rescale back.
71  temp = camera->GetFocalPoint();
72  camera->SetFocalPoint(temp[0] * scale, temp[1] * scale, temp[2] * scale);
73  temp = camera->GetPosition();
74  camera->SetPosition(temp[0] * scale, temp[1] * scale, temp[2] * scale);
75 }
76 
77 }; // namespace
78 
80 static PclUtils::PCLVis* s_viewer = nullptr;
81 
82 //-----------------------------------------------------------------------------
85  SetVisualizer(viewer);
86  updateCameraParameters();
87 }
88 
89 //-----------------------------------------------------------------------------
91 
93  if (viewer) {
94  s_viewer = reinterpret_cast<PclUtils::PCLVis*>(viewer);
95  if (!s_viewer) {
96  CVLog::Warning("[EditCameraTool::setVisualizer] viewer is Null!");
97  }
98  } else {
99  CVLog::Warning("[EditCameraTool::setVisualizer] viewer is Null!");
100  }
101 }
102 
104  if (!s_viewer) {
106  }
107 
110 
111  s_camera->GetViewUp(CurrentCameraParam.viewUp.u);
112  s_camera->GetFocalPoint(CurrentCameraParam.focal.u);
113  s_camera->GetPosition(CurrentCameraParam.position.u);
114  s_camera->GetClippingRange(CurrentCameraParam.clippRange.u);
115  CurrentCameraParam.viewAngle = s_camera->GetViewAngle();
116  CurrentCameraParam.eyeAngle = s_camera->GetEyeAngle();
119 }
120 
122  if (!s_viewer) {
124  }
125 
127 
128  s_camera->SetViewUp(CurrentCameraParam.viewUp.u);
129  s_camera->SetFocalPoint(CurrentCameraParam.focal.u);
130  s_camera->SetPosition(CurrentCameraParam.position.u);
131  s_camera->SetClippingRange(CurrentCameraParam.clippRange.u);
132 
133  s_camera->SetViewAngle(CurrentCameraParam.viewAngle);
134  s_camera->SetEyeAngle(CurrentCameraParam.eyeAngle);
137 
138  s_viewer->getCurrentRenderer()->SetActiveCamera(s_camera);
140 }
141 
142 //-----------------------------------------------------------------------------
143 void EditCameraTool::resetViewDirection(double look_x,
144  double look_y,
145  double look_z,
146  double up_x,
147  double up_y,
148  double up_z) {
149  if (s_viewer) {
150  s_viewer->setCameraPosition(0.0, 0.0, 0.0, look_x, look_y, look_z, up_x,
151  up_y, up_z);
153  double bounds[6];
154  s_viewer->getVisibleGeometryBounds().GetBounds(bounds);
155  s_viewer->resetCamera(bounds);
157  }
158 }
159 
160 void EditCameraTool::updateCamera() { UpdateCamera(); }
161 
162 void EditCameraTool::updateCameraParameters() { UpdateCameraInfo(); }
163 
164 //-----------------------------------------------------------------------------
165 void EditCameraTool::adjustCamera(CameraAdjustmentType enType, double value) {
166  if (s_viewer && s_camera) {
167  switch (enType) {
169  s_camera->Roll(value);
170  break;
172  RotateElevation(s_camera, value);
173  break;
175  s_camera->Azimuth(value);
176  break;
178  if (s_camera->GetParallelProjection()) {
179  s_camera->SetParallelScale(s_camera->GetParallelScale() /
180  value);
181  } else {
182  s_camera->Dolly(value);
183  }
184  } // if (EditCameraTool::Zoom)
185  break;
186  default:
187  break;
188  }
189 
191  }
192 }
193 
194 //-----------------------------------------------------------------------------
195 void EditCameraTool::saveCameraConfiguration(const std::string& file) {
196  if (s_viewer) {
197  s_viewer->saveCameraParameters(file);
198  }
199 }
200 
201 //-----------------------------------------------------------------------------
202 void EditCameraTool::loadCameraConfiguration(const std::string& file) {
203  if (s_viewer) {
204  s_viewer->loadCameraParameters(file);
205  updateCameraParameters();
206  }
207 }
static vtkSmartPointer< vtkCamera > s_camera
static PclUtils::PCLVis * s_viewer
static bool Warning(const char *format,...)
Prints out a formatted warning message in console.
Definition: CVLog.cpp:133
EditCameraTool(ecvGenericVisualizer3D *viewer)
static void SetVisualizer(ecvGenericVisualizer3D *viewer)
static void UpdateCamera()
static void UpdateCameraInfo()
~EditCameraTool() override
void setCenterOfRotation(double x, double y, double z)
Definition: PCLVis.cpp:389
vtkRenderer * getCurrentRenderer(int viewport=0)
Definition: PCLVis.cpp:2924
vtkSmartPointer< vtkCamera > getVtkCamera(int viewport=0)
Definition: PCLVis.cpp:2772
void synchronizeGeometryBounds(int viewport=0)
Definition: PCLVis.cpp:525
void setRotationFactor(double factor)
Definition: PCLVis.cpp:400
void UpdateScreen()
UpdateScreen - Updates/refreshes the render window This method forces a render update after actor cha...
Definition: PCLVis.cpp:3156
vtkBoundingBox getVisibleGeometryBounds()
Definition: PCLVis.h:611
double getRotationFactor()
Definition: PCLVis.cpp:409
void resetCamera(const ccBBox *bbox)
Definition: PCLVis.cpp:621
void getCenterOfRotation(double center[3])
Definition: PCLVis.cpp:323
Type u[3]
Definition: CVGeom.h:139
Type u[2]
Definition: CVGeom.h:38
static ecvGenericVisualizer3D * GetVisualizer3D()
static void UpdateScreen()
static CameraInfo CurrentCameraParam
static CameraInfo OldCameraParam
Generic visualizer 3D interface.
CLOUDVIEWER_HOST_DEVICE float Cross(const Point &a, const Point &b)
Definition: IoUImpl.h:39