ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
vtkTrackballPan.cxx
Go to the documentation of this file.
1 /*=========================================================================
2 
3  Program: ParaView
4  Module: vtkTrackballPan.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 "vtkTrackballPan.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 
25 
26 //-------------------------------------------------------------------------
28 {
29 }
30 
31 //-------------------------------------------------------------------------
33 {
34 }
35 
36 //-------------------------------------------------------------------------
37 void vtkTrackballPan::OnButtonDown(int, int, vtkRenderer*, vtkRenderWindowInteractor*)
38 {
39 }
40 
41 //-------------------------------------------------------------------------
42 void vtkTrackballPan::OnButtonUp(int, int, vtkRenderer*, vtkRenderWindowInteractor*)
43 {
44 }
45 
46 //-------------------------------------------------------------------------
47 void vtkTrackballPan::OnMouseMove(int x, int y, vtkRenderer* ren, vtkRenderWindowInteractor* rwi)
48 {
49  if (ren == NULL)
50  {
51  return;
52  }
53 
54  vtkCamera* camera = ren->GetActiveCamera();
55  double pos[3], fp[3];
56  camera->GetPosition(pos);
57  camera->GetFocalPoint(fp);
58 
59  if (camera->GetParallelProjection())
60  {
61  camera->OrthogonalizeViewUp();
62  double* up = camera->GetViewUp();
63  double* vpn = camera->GetViewPlaneNormal();
64  double right[3];
65  double scale, tmp;
66  camera->GetViewUp(up);
67  camera->GetViewPlaneNormal(vpn);
68  vtkMath::Cross(vpn, up, right);
69 
70  // These are different because y is flipped.
71  int* size = ren->GetSize();
72  double dx = (double)(x - rwi->GetLastEventPosition()[0]) / (double)(size[1]);
73  double dy = (double)(rwi->GetLastEventPosition()[1] - y) / (double)(size[1]);
74 
75  scale = camera->GetParallelScale();
76  dx *= scale * 2.0;
77  dy *= scale * 2.0;
78 
79  tmp = (right[0] * dx + up[0] * dy);
80  pos[0] += tmp;
81  fp[0] += tmp;
82  tmp = (right[1] * dx + up[1] * dy);
83  pos[1] += tmp;
84  fp[1] += tmp;
85  tmp = (right[2] * dx + up[2] * dy);
86  pos[2] += tmp;
87  fp[2] += tmp;
88  camera->SetPosition(pos);
89  camera->SetFocalPoint(fp);
90  }
91  else
92  {
93  double depth, worldPt[4], lastWorldPt[4];
94 
95  double center[3];
96  this->GetCenter(center);
97  ren->SetWorldPoint(center[0], center[1], center[2], 1.0);
98 
99  ren->WorldToDisplay();
100  depth = ren->GetDisplayPoint()[2];
101 
102  ren->SetDisplayPoint(x, y, depth);
103  ren->DisplayToWorld();
104  ren->GetWorldPoint(worldPt);
105  if (worldPt[3])
106  {
107  worldPt[0] /= worldPt[3];
108  worldPt[1] /= worldPt[3];
109  worldPt[2] /= worldPt[3];
110  worldPt[3] = 1.0;
111  }
112 
113  ren->SetDisplayPoint(rwi->GetLastEventPosition()[0], rwi->GetLastEventPosition()[1], depth);
114  ren->DisplayToWorld();
115  ren->GetWorldPoint(lastWorldPt);
116  if (lastWorldPt[3])
117  {
118  lastWorldPt[0] /= lastWorldPt[3];
119  lastWorldPt[1] /= lastWorldPt[3];
120  lastWorldPt[2] /= lastWorldPt[3];
121  lastWorldPt[3] = 1.0;
122  }
123 
124  pos[0] += lastWorldPt[0] - worldPt[0];
125  pos[1] += lastWorldPt[1] - worldPt[1];
126  pos[2] += lastWorldPt[2] - worldPt[2];
127 
128  fp[0] += lastWorldPt[0] - worldPt[0];
129  fp[1] += lastWorldPt[1] - worldPt[1];
130  fp[2] += lastWorldPt[2] - worldPt[2];
131 
132  camera->SetPosition(pos);
133  camera->SetFocalPoint(fp);
134  }
135  ren->ResetCameraClippingRange();
136  rwi->Render();
137 }
138 
139 //-------------------------------------------------------------------------
140 void vtkTrackballPan::PrintSelf(ostream& os, vtkIndent indent)
141 {
142  this->Superclass::PrintSelf(os, indent);
143 }
int size
#define NULL
void OnButtonUp(int x, int y, vtkRenderer *ren, vtkRenderWindowInteractor *iren) override
void OnButtonDown(int x, int y, vtkRenderer *ren, vtkRenderWindowInteractor *iren) override
~vtkTrackballPan() override
void PrintSelf(ostream &os, vtkIndent indent) override
void OnMouseMove(int x, int y, vtkRenderer *ren, vtkRenderWindowInteractor *iren) override
normal_z y
normal_z x
CLOUDVIEWER_HOST_DEVICE float Cross(const Point &a, const Point &b)
Definition: IoUImpl.h:39
vtkStandardNewMacro(vtkTrackballPan)