VTK  9.3.20240418
vtkRenderWindowInteractor3D.h
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
2 // SPDX-License-Identifier: BSD-3-Clause
20 #ifndef vtkRenderWindowInteractor3D_h
21 #define vtkRenderWindowInteractor3D_h
22 
24 #include "vtkRenderingCoreModule.h" // For export macro
25 
26 #include "vtkNew.h" // ivars
27 
28 VTK_ABI_NAMESPACE_BEGIN
29 class vtkCamera;
30 class vtkMatrix4x4;
31 enum class vtkEventDataDevice;
32 enum class vtkEventDataDeviceInput;
33 
34 class VTKRENDERINGCORE_EXPORT vtkRenderWindowInteractor3D : public vtkRenderWindowInteractor
35 {
36 public:
41 
43  void PrintSelf(ostream& os, vtkIndent indent) override;
44 
46 
55  void Enable() override;
56  void Disable() override;
58 
60 
65  virtual double* GetWorldEventPosition(int pointerIndex)
66  {
67  if (pointerIndex >= VTKI_MAX_POINTERS)
68  {
69  return nullptr;
70  }
71  return this->WorldEventPositions[pointerIndex];
72  }
73  virtual double* GetLastWorldEventPosition(int pointerIndex)
74  {
75  if (pointerIndex >= VTKI_MAX_POINTERS)
76  {
77  return nullptr;
78  }
79  return this->LastWorldEventPositions[pointerIndex];
80  }
81  virtual double* GetWorldEventOrientation(int pointerIndex)
82  {
83  if (pointerIndex >= VTKI_MAX_POINTERS)
84  {
85  return nullptr;
86  }
87  return this->WorldEventOrientations[pointerIndex];
88  }
89  virtual double* GetLastWorldEventOrientation(int pointerIndex)
90  {
91  if (pointerIndex >= VTKI_MAX_POINTERS)
92  {
93  return nullptr;
94  }
95  return this->LastWorldEventOrientations[pointerIndex];
96  }
97  virtual void GetWorldEventPose(vtkMatrix4x4* poseMatrix, int pointerIndex);
98  virtual void GetLastWorldEventPose(vtkMatrix4x4* poseMatrix, int pointerIndex);
100 
102 
107  virtual void SetPhysicalEventPosition(double x, double y, double z, int pointerIndex)
108  {
109  if (pointerIndex < 0 || pointerIndex >= VTKI_MAX_POINTERS)
110  {
111  return;
112  }
113  vtkDebugMacro(<< this->GetClassName() << " (" << this << "): setting PhysicalEventPosition to ("
114  << x << "," << y << "," << z << ") for pointerIndex number " << pointerIndex);
115  if (this->PhysicalEventPositions[pointerIndex][0] != x ||
116  this->PhysicalEventPositions[pointerIndex][1] != y ||
117  this->PhysicalEventPositions[pointerIndex][2] != z ||
118  this->LastPhysicalEventPositions[pointerIndex][0] != x ||
119  this->LastPhysicalEventPositions[pointerIndex][1] != y ||
120  this->LastPhysicalEventPositions[pointerIndex][2] != z)
121  {
122  this->LastPhysicalEventPositions[pointerIndex][0] =
123  this->PhysicalEventPositions[pointerIndex][0];
124  this->LastPhysicalEventPositions[pointerIndex][1] =
125  this->PhysicalEventPositions[pointerIndex][1];
126  this->LastPhysicalEventPositions[pointerIndex][2] =
127  this->PhysicalEventPositions[pointerIndex][2];
128  this->PhysicalEventPositions[pointerIndex][0] = x;
129  this->PhysicalEventPositions[pointerIndex][1] = y;
130  this->PhysicalEventPositions[pointerIndex][2] = z;
131  this->Modified();
132  }
133  }
134  virtual void SetPhysicalEventPose(vtkMatrix4x4* poseMatrix, int pointerIndex);
136 
138 
143  virtual void GetPhysicalEventPose(vtkMatrix4x4* poseMatrix, int pointerIndex);
144  virtual void GetLastPhysicalEventPose(vtkMatrix4x4* poseMatrix, int pointerIndex);
145  virtual void GetStartingPhysicalEventPose(vtkMatrix4x4* poseMatrix, int pointerIndex);
147 
151  virtual void GetStartingPhysicalToWorldMatrix(vtkMatrix4x4* startingPhysicalToWorldMatrix);
152 
164  virtual void SetStartingPhysicalToWorldMatrix(vtkMatrix4x4* startingPhysicalToWorldMatrix);
165 
178 
180 
185  virtual void SetWorldEventPosition(double x, double y, double z, int pointerIndex)
186  {
187  if (pointerIndex < 0 || pointerIndex >= VTKI_MAX_POINTERS)
188  {
189  return;
190  }
191  vtkDebugMacro(<< this->GetClassName() << " (" << this << "): setting WorldEventPosition to ("
192  << x << "," << y << "," << z << ") for pointerIndex number " << pointerIndex);
193  if (this->WorldEventPositions[pointerIndex][0] != x ||
194  this->WorldEventPositions[pointerIndex][1] != y ||
195  this->WorldEventPositions[pointerIndex][2] != z ||
196  this->LastWorldEventPositions[pointerIndex][0] != x ||
197  this->LastWorldEventPositions[pointerIndex][1] != y ||
198  this->LastWorldEventPositions[pointerIndex][2] != z)
199  {
200  this->LastWorldEventPositions[pointerIndex][0] = this->WorldEventPositions[pointerIndex][0];
201  this->LastWorldEventPositions[pointerIndex][1] = this->WorldEventPositions[pointerIndex][1];
202  this->LastWorldEventPositions[pointerIndex][2] = this->WorldEventPositions[pointerIndex][2];
203  this->WorldEventPositions[pointerIndex][0] = x;
204  this->WorldEventPositions[pointerIndex][1] = y;
205  this->WorldEventPositions[pointerIndex][2] = z;
206  this->Modified();
207  }
208  }
209  virtual void SetWorldEventOrientation(double w, double x, double y, double z, int pointerIndex)
210  {
211  if (pointerIndex < 0 || pointerIndex >= VTKI_MAX_POINTERS)
212  {
213  return;
214  }
215  vtkDebugMacro(<< this->GetClassName() << " (" << this << "): setting WorldEventOrientation to ("
216  << w << "," << x << "," << y << "," << z << ") for pointerIndex number "
217  << pointerIndex);
218  if (this->WorldEventOrientations[pointerIndex][0] != w ||
219  this->WorldEventOrientations[pointerIndex][1] != x ||
220  this->WorldEventOrientations[pointerIndex][2] != y ||
221  this->WorldEventOrientations[pointerIndex][3] != z ||
222  this->LastWorldEventOrientations[pointerIndex][0] != w ||
223  this->LastWorldEventOrientations[pointerIndex][1] != x ||
224  this->LastWorldEventOrientations[pointerIndex][2] != y ||
225  this->LastWorldEventOrientations[pointerIndex][3] != z)
226  {
227  this->LastWorldEventOrientations[pointerIndex][0] =
228  this->WorldEventOrientations[pointerIndex][0];
229  this->LastWorldEventOrientations[pointerIndex][1] =
230  this->WorldEventOrientations[pointerIndex][1];
231  this->LastWorldEventOrientations[pointerIndex][2] =
232  this->WorldEventOrientations[pointerIndex][2];
233  this->LastWorldEventOrientations[pointerIndex][3] =
234  this->WorldEventOrientations[pointerIndex][3];
235  this->WorldEventOrientations[pointerIndex][0] = w;
236  this->WorldEventOrientations[pointerIndex][1] = x;
237  this->WorldEventOrientations[pointerIndex][2] = y;
238  this->WorldEventOrientations[pointerIndex][3] = z;
239  this->Modified();
240  }
241  }
242  virtual void SetWorldEventPose(vtkMatrix4x4* poseMatrix, int pointerIndex);
244 
246 
249  void RightButtonPressEvent() override;
250  void RightButtonReleaseEvent() override;
252 
254 
257  void MiddleButtonPressEvent() override;
258  void MiddleButtonReleaseEvent() override;
260 
262 
267 
269 
272  virtual void SetPhysicalViewDirection(double, double, double) {}
273  virtual double* GetPhysicalViewDirection() { return nullptr; }
275 
277 
280  virtual void SetPhysicalViewUp(double, double, double) {}
281  virtual double* GetPhysicalViewUp() { return nullptr; }
283 
285 
288  virtual void SetPhysicalTranslation(vtkCamera*, double, double, double) {}
289  virtual double* GetPhysicalTranslation(vtkCamera*) { return nullptr; }
291 
293 
296  virtual void SetPhysicalScale(double) {}
297  virtual double GetPhysicalScale() { return 1.0; }
299 
301 
304  void SetTranslation3D(double val[3]);
305  vtkGetVector3Macro(Translation3D, double);
306  vtkGetVector3Macro(LastTranslation3D, double);
308 
309 protected:
312 
315  double Translation3D[3];
316  double LastTranslation3D[3];
317 
318  double WorldEventPositions[VTKI_MAX_POINTERS][3];
319  double LastWorldEventPositions[VTKI_MAX_POINTERS][3];
320  double PhysicalEventPositions[VTKI_MAX_POINTERS][3];
321  double LastPhysicalEventPositions[VTKI_MAX_POINTERS][3];
322  double StartingPhysicalEventPositions[VTKI_MAX_POINTERS][3];
323  double WorldEventOrientations[VTKI_MAX_POINTERS][4];
324  double LastWorldEventOrientations[VTKI_MAX_POINTERS][4];
328  vtkNew<vtkMatrix4x4> LastPhysicalEventPoses[VTKI_MAX_POINTERS];
329  vtkNew<vtkMatrix4x4> StartingPhysicalEventPoses[VTKI_MAX_POINTERS];
331 
336 
337 private:
339  void operator=(const vtkRenderWindowInteractor3D&) = delete;
340 };
341 
342 VTK_ABI_NAMESPACE_END
343 #endif
a virtual camera for 3D rendering
Definition: vtkCamera.h:151
a simple class to control print indentation
Definition: vtkIndent.h:108
represent and manipulate 4x4 transformation matrices
Definition: vtkMatrix4x4.h:141
const char * GetClassName() const
Return the class name as a string.
virtual void Modified()
Update the modification time for this object.
adds support for 3D events to vtkRenderWindowInteractor.
void Disable() override
Enable/Disable interactions.
virtual void SetPhysicalViewUp(double, double, double)
Set/get the direction of the physical coordinate system +Y axis in world coordinates.
virtual void SetPhysicalViewDirection(double, double, double)
Set/get the direction of the physical coordinate system -Z axis in world coordinates.
virtual void GetPhysicalEventPose(vtkMatrix4x4 *poseMatrix, int pointerIndex)
With VR we know the physical/room coordinate positions and orientations of events.
void RightButtonPressEvent() override
Override to set pointers down.
void SetTranslation3D(double val[3])
Set/get the translation for pan/swipe gestures, update LastTranslation.
virtual void SetWorldEventPosition(double x, double y, double z, int pointerIndex)
With VR we know the world coordinate positions and orientations of events.
virtual void GetTouchPadPosition(vtkEventDataDevice, vtkEventDataDeviceInput, float[3])
Get the latest touchpad or joystick position for a device.
virtual double GetPhysicalScale()
Set/get the physical scale (world / physical distance ratio)
void RecognizeGesture(vtkCommand::EventIds) override
virtual double * GetLastWorldEventOrientation(int pointerIndex)
With VR we know the world coordinate positions and orientations of events.
virtual void SetWorldEventOrientation(double w, double x, double y, double z, int pointerIndex)
With VR we know the world coordinate positions and orientations of events.
virtual double * GetWorldEventPosition(int pointerIndex)
With VR we know the world coordinate positions and orientations of events.
void RightButtonReleaseEvent() override
Override to set pointers down.
virtual void SetWorldEventPose(vtkMatrix4x4 *poseMatrix, int pointerIndex)
With VR we know the world coordinate positions and orientations of events.
~vtkRenderWindowInteractor3D() override
virtual void SetPhysicalEventPosition(double x, double y, double z, int pointerIndex)
With VR we know the physical/room coordinate positions and orientations of events.
virtual void GetLastWorldEventPose(vtkMatrix4x4 *poseMatrix, int pointerIndex)
With VR we know the world coordinate positions and orientations of events.
virtual void SetPhysicalScale(double)
Set/get the physical scale (world / physical distance ratio)
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
virtual void SetPhysicalTranslation(vtkCamera *, double, double, double)
Set/get position of the physical coordinate system origin in world coordinates.
virtual double * GetWorldEventOrientation(int pointerIndex)
With VR we know the world coordinate positions and orientations of events.
virtual void GetWorldEventPose(vtkMatrix4x4 *poseMatrix, int pointerIndex)
With VR we know the world coordinate positions and orientations of events.
void MiddleButtonPressEvent() override
Override to set pointers down.
static vtkRenderWindowInteractor3D * New()
Construct object so that light follows camera motion.
virtual void SetStartingPhysicalToWorldMatrix(vtkMatrix4x4 *startingPhysicalToWorldMatrix)
Set starting physical to world matrix.
void MiddleButtonReleaseEvent() override
Override to set pointers down.
virtual void GetLastPhysicalEventPose(vtkMatrix4x4 *poseMatrix, int pointerIndex)
With VR we know the physical/room coordinate positions and orientations of events.
virtual void SetStartingPhysicalEventPose(vtkMatrix4x4 *poseMatrix, vtkEventDataDevice device)
Set starting physical event pose.
virtual void SetPhysicalEventPose(vtkMatrix4x4 *poseMatrix, int pointerIndex)
With VR we know the physical/room coordinate positions and orientations of events.
virtual void GetStartingPhysicalEventPose(vtkMatrix4x4 *poseMatrix, int pointerIndex)
With VR we know the physical/room coordinate positions and orientations of events.
void Enable() override
Enable/Disable interactions.
virtual double * GetPhysicalViewUp()
Set/get the direction of the physical coordinate system +Y axis in world coordinates.
virtual void GetStartingPhysicalToWorldMatrix(vtkMatrix4x4 *startingPhysicalToWorldMatrix)
Return starting physical to world matrix.
virtual double * GetPhysicalViewDirection()
Set/get the direction of the physical coordinate system -Z axis in world coordinates.
vtkNew< vtkMatrix4x4 > StartingPhysicalToWorldMatrix
Store physical to world matrix at the start of a complex gesture.
virtual double * GetPhysicalTranslation(vtkCamera *)
Set/get position of the physical coordinate system origin in world coordinates.
virtual double * GetLastWorldEventPosition(int pointerIndex)
With VR we know the world coordinate positions and orientations of events.
platform-independent render window interaction including picking and frame rate control.
vtkEventDataDevice
platform-independent event data structures
Definition: vtkEventData.h:15
vtkEventDataDeviceInput
Definition: vtkEventData.h:29
#define VTKI_MAX_POINTERS