You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

132 lines
4.3 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkInteractorStyle3D.h
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
/**
* @class vtkInteractorStyle3D
* @brief extends interaction to support 3D input
*
* vtkInteractorStyle3D allows the user to interact with (rotate,
* pan, etc.) objects in the scene indendent of each other. It is designed
* to use 3d positions and orientations instead of 2D.
*
* The following interactions are specified by default.
*
* A click and hold in 3D within the bounding box of a prop
* will pick up that prop allowing you to translate and
* orient that prop as desired with the 3D controller.
*
* Click/dragging two controllers and pulling them apart or
* pushing them together will initial a scale gesture
* that will scale the world larger or smaller.
*
* Click/dragging two controllers and translating them in the same
* direction will translate the camera/world
* pushing them together will initial a scale gesture
* that will scale the world larger or smaller.
*
* If a controller is right clicked (push touchpad on Vive)
* then it starts a fly motion where the camer moves in the
* direction the controller is pointing. It moves at a speed
* scaled by the position of your thumb on the trackpad.
* Higher moves faster forward. Lower moves faster backwards.
*
* For the Vive left click is mapped to the trigger and right
* click is mapped to pushing the trackpad down.
*
* @sa
* vtkRenderWindowInteractor3D
*/
#ifndef vtkInteractorStyle3D_h
#define vtkInteractorStyle3D_h
#include "vtkInteractorStyle.h"
#include "vtkNew.h" // ivars
#include "vtkRenderingCoreModule.h" // For export macro
class vtkAbstractPropPicker;
class vtkCamera;
class vtkProp3D;
class vtkMatrix3x3;
class vtkMatrix4x4;
class vtkTimerLog;
class vtkTransform;
class VTKRENDERINGCORE_EXPORT vtkInteractorStyle3D : public vtkInteractorStyle
{
public:
static vtkInteractorStyle3D* New();
vtkTypeMacro(vtkInteractorStyle3D, vtkInteractorStyle);
void PrintSelf(ostream& os, vtkIndent indent) override;
// This method handles updating the prop based on changes in the devices
// pose. We use rotate as the state to mean adjusting-the-actor-pose
virtual void PositionProp(vtkEventData*);
// This method handles updating the camera based on changes in the devices
// pose. We use Dolly as the state to mean moving the camera forward
virtual void Dolly3D(vtkEventData*);
//@{
/**
* Set/Get the maximum dolly speed used when flying in 3D, in meters per second.
* Default is 1.6666, corresponding to walking speed (= 6 km/h).
* This speed is scaled by the touchpad position as well.
*/
vtkSetMacro(DollyPhysicalSpeed, double);
vtkGetMacro(DollyPhysicalSpeed, double);
//@}
/**
* Set the scaling factor from world to physical space.
* In VR when we set it to a new value we also adjust the
* HMD position to maintain the same relative position.
*/
virtual void SetScale(vtkCamera* cam, double newScale);
//@{
/**
* Get/Set the interaction picker.
* By default, a vtkPropPicker is instancied.
*/
vtkGetObjectMacro(InteractionPicker, vtkAbstractPropPicker);
void SetInteractionPicker(vtkAbstractPropPicker* prop);
protected:
vtkInteractorStyle3D();
~vtkInteractorStyle3D() override;
void FindPickedActor(double pos[3], double orient[4]);
void Prop3DTransform(
vtkProp3D* prop3D, double* boxCenter, int NumRotation, double** rotate, double* scale);
vtkAbstractPropPicker* InteractionPicker;
vtkProp3D* InteractionProp;
vtkMatrix3x3* TempMatrix3;
vtkMatrix4x4* TempMatrix4;
vtkTransform* TempTransform;
double AppliedTranslation[3];
double DollyPhysicalSpeed;
vtkNew<vtkTimerLog> LastDolly3DEventTime;
private:
vtkInteractorStyle3D(const vtkInteractorStyle3D&) = delete; // Not implemented.
void operator=(const vtkInteractorStyle3D&) = delete; // Not implemented.
};
#endif