ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
vtkPVTrackballRotate.cxx
Go to the documentation of this file.
1 /*=========================================================================
2 
3  Program: ParaView
4  Module: vtkPVTrackballRotate.cxx
5 
6  Copyright (c) Kitware, Inc.
7  All rights reserved.
8  See Copyright.txt or http://www.paraview.org/HTML/Copyright.html for details.
9 
10  This software is distributed WITHOUT ANY WARRANTY; without even
11  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12  PURPOSE. See the above copyright notice for more information.
13 
14 =========================================================================*/
15 #include "vtkPVTrackballRotate.h"
16 
17 #include "vtkCamera.h"
18 #include "vtkMath.h"
19 #include "vtkObjectFactory.h"
20 #include "vtkRenderWindow.h"
21 #include "vtkRenderWindowInteractor.h"
22 #include "vtkRenderer.h"
23 #include "vtkTransform.h"
24 
25 #include <cstdlib>
26 
28 
29 //-------------------------------------------------------------------------
31 {
32  this->KeyCode = 0;
33 }
34 
35 //-------------------------------------------------------------------------
37 {
38 }
39 
40 //-------------------------------------------------------------------------
41 void vtkPVTrackballRotate::OnButtonDown(int, int, vtkRenderer* ren, vtkRenderWindowInteractor*)
42 {
43  this->ComputeDisplayCenter(ren);
44 }
45 
46 //-------------------------------------------------------------------------
47 void vtkPVTrackballRotate::OnButtonUp(int, int, vtkRenderer*, vtkRenderWindowInteractor*)
48 {
49 }
50 
51 //-------------------------------------------------------------------------
53  int x, int y, vtkRenderer* ren, vtkRenderWindowInteractor* rwi)
54 {
55  if (ren == NULL)
56  {
57  return;
58  }
59 
60  vtkTransform* transform = vtkTransform::New();
61  vtkCamera* camera = ren->GetActiveCamera();
62 
63  double scale = vtkMath::Norm(camera->GetPosition());
64  if (scale <= 0.0)
65  {
66  scale = vtkMath::Norm(camera->GetFocalPoint());
67  if (scale <= 0.0)
68  {
69  scale = 1.0;
70  }
71  }
72  double* temp = camera->GetFocalPoint();
73  camera->SetFocalPoint(temp[0] / scale, temp[1] / scale, temp[2] / scale);
74  temp = camera->GetPosition();
75  camera->SetPosition(temp[0] / scale, temp[1] / scale, temp[2] / scale);
76 
77  double v2[3];
78  // translate to center
79  transform->Identity();
80  transform->Translate(this->Center[0] / scale, this->Center[1] / scale, this->Center[2] / scale);
81 
82  int dx = rwi->GetLastEventPosition()[0] - x;
83  int dy = rwi->GetLastEventPosition()[1] - y;
84 
85  camera->OrthogonalizeViewUp();
86  int* size = ren->GetSize();
87 
88  if (this->GetKeyCode() == 'x' || this->GetKeyCode() == 'y' || this->GetKeyCode() == 'z' ||
89  this->GetKeyCode() == 'X' || this->GetKeyCode() == 'Y' || this->GetKeyCode() == 'Z')
90  {
91  bool use_dx = std::abs(dx) > std::abs(dy);
92  double delta = 360 * this->RotationFactor * (use_dx ? dx * 1.0 / size[0] : dy * -1.0 / size[1]);
93  double axis[3] = { 0, 0, 0 };
94  switch (this->GetKeyCode())
95  {
96  case 'x':
97  case 'X':
98  axis[0] = 1.0;
99  break;
100  case 'y':
101  case 'Y':
102  axis[1] = 1.0;
103  break;
104  case 'z':
105  case 'Z':
106  axis[2] = 1.0;
107  break;
108  default:
109  abort();
110  }
111  transform->RotateWXYZ(delta, axis[0], axis[1], axis[2]);
112  }
113  else
114  {
115  // azimuth
116  double* viewUp = camera->GetViewUp();
117  transform->RotateWXYZ(
118  360.0 * dx / size[0] * this->RotationFactor, viewUp[0], viewUp[1], viewUp[2]);
119 
120  // elevation
121  vtkMath::Cross(camera->GetDirectionOfProjection(), viewUp, v2);
122  transform->RotateWXYZ(-360.0 * dy / size[1] * this->RotationFactor, v2[0], v2[1], v2[2]);
123  }
124 
125  // translate back
126  transform->Translate(
127  -this->Center[0] / scale, -this->Center[1] / scale, -this->Center[2] / scale);
128 
129  camera->ApplyTransform(transform);
130  camera->OrthogonalizeViewUp();
131 
132  // For rescale back.
133  temp = camera->GetFocalPoint();
134  camera->SetFocalPoint(temp[0] * scale, temp[1] * scale, temp[2] * scale);
135  temp = camera->GetPosition();
136  camera->SetPosition(temp[0] * scale, temp[1] * scale, temp[2] * scale);
137 
138  rwi->Render();
139  transform->Delete();
140 }
141 
142 //-------------------------------------------------------------------------
143 void vtkPVTrackballRotate::OnKeyUp(vtkRenderWindowInteractor* iren)
144 {
145  if (iren->GetKeyCode() == this->KeyCode)
146  {
147  this->KeyCode = 0;
148  }
149 }
150 
151 //-------------------------------------------------------------------------
152 void vtkPVTrackballRotate::OnKeyDown(vtkRenderWindowInteractor* iren)
153 {
154  if (this->KeyCode == 0)
155  {
156  this->KeyCode = iren->GetKeyCode();
157  }
158 }
159 
160 //-------------------------------------------------------------------------
161 void vtkPVTrackballRotate::PrintSelf(ostream& os, vtkIndent indent)
162 {
163  this->Superclass::PrintSelf(os, indent);
164  os << indent << "Center: " << this->Center[0] << ", " << this->Center[1] << ", "
165  << this->Center[2] << endl;
166 }
int size
#define NULL
void ComputeDisplayCenter(vtkRenderer *ren)
void OnKeyDown(vtkRenderWindowInteractor *iren) override
void OnButtonUp(int x, int y, vtkRenderer *ren, vtkRenderWindowInteractor *rwi) override
void OnKeyUp(vtkRenderWindowInteractor *iren) override
void OnButtonDown(int x, int y, vtkRenderer *ren, vtkRenderWindowInteractor *rwi) override
void OnMouseMove(int x, int y, vtkRenderer *ren, vtkRenderWindowInteractor *rwi) override
void PrintSelf(ostream &os, vtkIndent indent) override
normal_z y
normal_z x
QTextStream & endl(QTextStream &stream)
Definition: QtCompat.h:718
CLOUDVIEWER_HOST_DEVICE float Cross(const Point &a, const Point &b)
Definition: IoUImpl.h:39
vtkStandardNewMacro(vtkPVTrackballRotate)