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