17 #include "vtkCamera.h"
20 #include "vtkObjectFactory.h"
21 #include "vtkRenderWindow.h"
22 #include "vtkRenderWindowInteractor.h"
23 #include "vtkRenderer.h"
24 #include "vtkTimerLog.h"
58 "Joystick Fly manipulator has to be used from one of the two subclasses (In and Out)");
61 if (!this->GetGUIHelper())
63 vtkErrorMacro(
"GUIHelper is not defined");
68 vtkErrorMacro(
"Renderer or Render Window Interactor are not defined");
72 double* range = ren->GetActiveCamera()->GetClippingRange();
73 this->
Fly(ren, rwi, range[1], (this->
In ? 1 : -1) * this->
FlySpeed * .01);
91 if (this->
FlyFlag || !this->GetGUIHelper())
97 int*
size = ren->GetSize();
100 vtkCamera* cam = ren->GetActiveCamera();
104 vtkTimerLog* timer = vtkTimerLog::New();
117 double* range = cam->GetClippingRange();
118 double dist = 0.5 * (range[1] + range[0]);
119 double lastx = rwi->GetLastEventPosition()[0];
120 double lasty =
size[1] - rwi->GetLastEventPosition()[1] - 1;
140 double vx = (
size[0] / 2 - lastx) / (
double)(
size[0]);
141 double vy = (
size[1] / 2 - lasty) / (
double)(
size[0]);
146 if (cam->GetParallelProjection())
148 double parallelScale = cam->GetParallelScale();
149 viewAngle = 360.0 * atan2(parallelScale * 0.5, dist) /
vtkMath::Pi();
153 viewAngle = cam->GetViewAngle();
159 speed = ispeed * range[1];
173 cam->OrthogonalizeViewUp();
177 vx = (double)(
size[0] / 2 - lastx) / (double)(
size[0]);
178 vy = (double)(
size[1] / 2 - lasty) / (double)(
size[1]);
179 vx = (vx < 0) ? (-vx) : (vx);
180 vy = (vy < 0) ? (-vy) : (vy);
181 vx = (vx > vy) ? (vx) : (vy);
182 speed *= (1.0 - 2.0 * vx);
187 double fp[3], pos[3];
188 cam->GetPosition(pos);
189 cam->GetFocalPoint(fp);
191 dir[0] = fp[0] - pos[0];
192 dir[1] = fp[1] - pos[1];
193 dir[2] = fp[2] - pos[2];
194 vtkMath::Normalize(dir);
204 cam->SetPosition(pos);
205 cam->SetFocalPoint(fp);
208 if (cam->GetParallelProjection())
210 double scale = cam->GetParallelScale();
211 if (dist > 0.0 && dist > speed)
213 scale = scale * (dist - speed) / dist;
214 cam->SetParallelScale(scale);
222 this->GetGUIHelper()->UpdateGUI();
231 vtkCamera* camera = ren->GetActiveCamera();
233 camera->OrthogonalizeViewUp();
235 camera->GetDirectionOfProjection(this->
CameraZAxis);
249 this->Superclass::PrintSelf(os, indent);
void Fly(vtkRenderer *ren, vtkRenderWindowInteractor *rwi, double scale, double speed)
void OnMouseMove(int x, int y, vtkRenderer *ren, vtkRenderWindowInteractor *rwi) override
void PrintSelf(ostream &os, vtkIndent indent) override
~vtkPVJoystickFly() override
void OnButtonUp(int x, int y, vtkRenderer *ren, vtkRenderWindowInteractor *rwi) override
void OnButtonDown(int x, int y, vtkRenderer *ren, vtkRenderWindowInteractor *rwi) override
void ComputeCameraAxes(vtkRenderer *)
QTextStream & endl(QTextStream &stream)
CLOUDVIEWER_HOST_DEVICE float Cross(const Point &a, const Point &b)