ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
vtkPVTrackballRoll.cxx
Go to the documentation of this file.
1 /*=========================================================================
2 
3  Program: ParaView
4  Module: vtkPVTrackballRoll.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 "vtkPVTrackballRoll.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 
26 
27 //-------------------------------------------------------------------------
29 {
30 }
31 
32 //-------------------------------------------------------------------------
34 {
35 }
36 
37 //-------------------------------------------------------------------------
38 void vtkPVTrackballRoll::OnButtonDown(int, int, vtkRenderer*, vtkRenderWindowInteractor*)
39 {
40 }
41 
42 //-------------------------------------------------------------------------
43 void vtkPVTrackballRoll::OnButtonUp(int, int, vtkRenderer*, vtkRenderWindowInteractor*)
44 {
45 }
46 
47 //-------------------------------------------------------------------------
48 void vtkPVTrackballRoll::OnMouseMove(int x, int y, vtkRenderer* ren, vtkRenderWindowInteractor* rwi)
49 {
50  if (ren == NULL)
51  {
52  return;
53  }
54 
55  vtkCamera* camera = ren->GetActiveCamera();
56  double axis[3];
57 
58  // compute view vector (rotation axis)
59  double* pos = camera->GetPosition();
60  double* fp = camera->GetFocalPoint();
61 
62  axis[0] = fp[0] - pos[0];
63  axis[1] = fp[1] - pos[1];
64  axis[2] = fp[2] - pos[2];
65 
66  // compute the angle of rotation
67  // - first compute the two vectors (center to mouse)
68  this->ComputeDisplayCenter(ren);
69 
70  int x1, x2, y1, y2;
71  x1 = rwi->GetLastEventPosition()[0] - (int)this->DisplayCenter[0];
72  x2 = x - (int)this->DisplayCenter[0];
73  y1 = rwi->GetLastEventPosition()[1] - (int)this->DisplayCenter[1];
74  y2 = y - (int)this->DisplayCenter[1];
75  if ((x2 == 0.0 && y2 == 0.0) || (x1 == 0.0 && y1 == 0.0))
76  {
77  // don't ever want to divide by zero
78  return;
79  }
80 
81  // - divide by magnitudes to get angle
82  double angle = vtkMath::DegreesFromRadians((x1 * y2 - y1 * x2) /
83  (sqrt(static_cast<double>(x1 * x1 + y1 * y1)) * sqrt(static_cast<double>(x2 * x2 + y2 * y2))));
84 
85  // translate to center
86  vtkTransform* transform = vtkTransform::New();
87  transform->Identity();
88  transform->Translate(this->Center[0], this->Center[1], this->Center[2]);
89 
90  // roll
91  transform->RotateWXYZ(angle, axis[0], axis[1], axis[2]);
92 
93  // translate back
94  transform->Translate(-this->Center[0], -this->Center[1], -this->Center[2]);
95 
96  camera->ApplyTransform(transform);
97  camera->OrthogonalizeViewUp();
98 
99  rwi->Render();
100  transform->Delete();
101 }
102 
103 //-------------------------------------------------------------------------
104 void vtkPVTrackballRoll::PrintSelf(ostream& os, vtkIndent indent)
105 {
106  this->Superclass::PrintSelf(os, indent);
107 }
#define NULL
void ComputeDisplayCenter(vtkRenderer *ren)
void OnMouseMove(int x, int y, vtkRenderer *ren, vtkRenderWindowInteractor *rwi) override
void OnButtonDown(int x, int y, vtkRenderer *ren, vtkRenderWindowInteractor *rwi) override
void OnButtonUp(int x, int y, vtkRenderer *ren, vtkRenderWindowInteractor *rwi) override
void PrintSelf(ostream &os, vtkIndent indent) override
normal_z y
normal_z x
vtkStandardNewMacro(vtkPVTrackballRoll)