Public Types | Public Member Functions | Static Public Member Functions | Protected Member Functions | Protected Attributes

mitk::SpaceNavigatorVtkCameraController Class Reference
[Navigation Control Classes]

vtk-based camera controller More...

#include <mitkSpaceNavigatorVtkCameraController.h>

Inheritance diagram for mitk::SpaceNavigatorVtkCameraController:
Inheritance graph
[legend]
Collaboration diagram for mitk::SpaceNavigatorVtkCameraController:
Collaboration graph
[legend]

List of all members.

Public Types

typedef
SpaceNavigatorVtkCameraController 
Self
typedef CameraController Superclass
typedef itk::SmartPointer< SelfPointer
typedef itk::SmartPointer
< const Self
ConstPointer

Public Member Functions

virtual const char * GetClassName () const
virtual bool OnSpaceNavigatorEvent (mitk::Action *a, const mitk::StateEvent *e)
virtual bool OnSpaceNavigatorKeyDown (mitk::Action *a, const mitk::StateEvent *e)

Static Public Member Functions

static Pointer New ()

Protected Member Functions

 SpaceNavigatorVtkCameraController ()
virtual ~SpaceNavigatorVtkCameraController ()

Protected Attributes

bool m_ClippingRangeIsSet

Detailed Description

vtk-based camera controller

The Space Navigator camera controller listens to events from a Space Navigator.
After receiving such events, it moves the camera of the 3D window accordingly.

Definition at line 36 of file mitkSpaceNavigatorVtkCameraController.h.


Member Typedef Documentation

Reimplemented from mitk::StateMachine.

Definition at line 42 of file mitkSpaceNavigatorVtkCameraController.h.

Reimplemented from mitk::StateMachine.

Definition at line 42 of file mitkSpaceNavigatorVtkCameraController.h.

Reimplemented from mitk::StateMachine.

Definition at line 42 of file mitkSpaceNavigatorVtkCameraController.h.

Reimplemented from mitk::StateMachine.

Definition at line 42 of file mitkSpaceNavigatorVtkCameraController.h.


Constructor & Destructor Documentation

mitk::SpaceNavigatorVtkCameraController::SpaceNavigatorVtkCameraController (  ) [protected]
mitk::SpaceNavigatorVtkCameraController::~SpaceNavigatorVtkCameraController (  ) [protected, virtual]

Default Destructor

Definition at line 45 of file mitkSpaceNavigatorVtkCameraController.cpp.

{
}

Member Function Documentation

virtual const char* mitk::SpaceNavigatorVtkCameraController::GetClassName (  ) const [virtual]

Reimplemented from mitk::StateMachine.

static Pointer mitk::SpaceNavigatorVtkCameraController::New (  ) [static]

Reimplemented from mitk::BaseController.

bool mitk::SpaceNavigatorVtkCameraController::OnSpaceNavigatorEvent ( mitk::Action a,
const mitk::StateEvent e 
) [virtual]

Definition at line 49 of file mitkSpaceNavigatorVtkCameraController.cpp.

References ANGLESENSITIVITY, mitk::DataStorage::ComputeBoundingBox(), mitk::RenderingManager::ForceImmediateUpdate(), mitk::SpaceNavigatorEvent::GetAngle(), mitk::StateEvent::GetEvent(), mitk::GlobalInteraction::GetFocus(), mitk::RenderingManager::GetInstance(), mitk::GlobalInteraction::GetInstance(), mitk::SpaceNavigatorEvent::GetRotation(), mitk::SpaceNavigatorEvent::GetTranslation(), MITK_ERROR, ROTATIONSENSIVITY, QuadProgPP::sqrt(), mitk::BaseRenderer::Standard3D, and TRANSLATIONSENSITIVITY.

Referenced by SpaceNavigatorVtkCameraController().

{
  //only if 3D rendering
  const mitk::BaseRenderer* br = mitk::GlobalInteraction::GetInstance()->GetFocus();
  this->SetRenderer( br );
  mitk::BaseRenderer::MapperSlotId id = ((mitk::BaseRenderer*)(br))->GetMapperID();
  if (id != mitk::BaseRenderer::Standard3D)
    return true;

  //only if focused by the FocusManager
  if (this->GetRenderer() != mitk::GlobalInteraction::GetInstance()->GetFocus())
    return true;

  //pre-checking for safety
  vtkRenderer* vtkRenderer = ((mitk::VtkPropRenderer*)this->GetRenderer())->GetVtkRenderer();
  if (vtkRenderer == NULL)
    return false;


  vtkCamera* vtkCam = (vtkCamera*)vtkRenderer->GetActiveCamera();

  if(!m_ClippingRangeIsSet)
    vtkCam->SetClippingRange(0.1, 1000000);

  const mitk::SpaceNavigatorEvent* snevent = dynamic_cast<const mitk::SpaceNavigatorEvent*>(e->GetEvent());
  if (snevent == NULL)
  {
    MITK_ERROR <<"Wrong event for SpaceNavigatorVtkCameraController!";
    return false;
  }

  //get the information from the mouse
  mitk::Vector3D translation = snevent->GetTranslation();
  mitk::Vector3D rotation = snevent->GetRotation();
  mitk::ScalarType angle = snevent->GetAngle();

  //output for debug
  //std::cout<<"translation: "<<translation[0]<<" "<<translation[1]<<" "<<translation[2]<<" "<<"\n";
  //std::cout<<"rotation: "<<rotation[0]<<" "<<rotation[1]<<" "<<rotation[2]<<" "<<"\n";
  //std::cout<<"angle: "<<angle<<"\n \n";


  //empirically gained max and min valued from driver:
  // MAXIMA:
  // translation:  0.83    1.17    1.02    
  // rotation:     1.00    1.00    1.00    
  // angle:        0.83
  // MINIMA:
  // translation: -1.00   -1.03   -0.88   
  // rotation:    -1.00   -1.00   -1.00   
  // angle:        0.00

  //compute current sensitivity according to current BoundingBox of the whole scene!
  double sceneSensivity = 1.0;

  mitk::DataStorage* ds = m_Renderer->GetDataStorage();
  mitk::BoundingBox::Pointer bb = ds->ComputeBoundingBox();
  mitk::BoundingBox::AccumulateType length = bb->GetDiagonalLength2();
  if (length > 0.00001)//if length not zero
    sceneSensivity *= 100.0 / (sqrt(length)) ;

  //sensivity to adapt to mitk speed
  translation *= sceneSensivity * TRANSLATIONSENSITIVITY;
  rotation *= sceneSensivity * ROTATIONSENSIVITY;
  angle *= sceneSensivity * ANGLESENSITIVITY;

  //compute the global space coordinates from the relative mouse coordinate
  //first we need the position of the camera
  mitk::Vector3D camPosition;
  double camPositionTemp[3];
  vtkCam->GetPosition(camPositionTemp);
  camPosition[0] = camPositionTemp[0]; camPosition[1] = camPositionTemp[1]; camPosition[2] = camPositionTemp[2]; 

  //then the upvector of the camera
  mitk::Vector3D upCamVector;
  double upCamTemp[3];
  vtkCam->GetViewUp(upCamTemp);
  upCamVector[0] = upCamTemp[0]; upCamVector[1] = upCamTemp[1]; upCamVector[2] = upCamTemp[2]; 
  upCamVector.Normalize();

  //then the vector to which the camera is heading at (focalpoint)
  mitk::Vector3D focalPoint;
  double focalPointTemp[3];
  vtkCam->GetFocalPoint(focalPointTemp);
  focalPoint[0] = focalPointTemp[0]; focalPoint[1] = focalPointTemp[1]; focalPoint[2] = focalPointTemp[2]; 
  mitk::Vector3D focalVector;
  focalVector = focalPoint - camPosition;
  focalVector.Normalize();

  //orthogonal vector to focalVector and upCamVector
  mitk::Vector3D crossVector;
  crossVector = CrossProduct(upCamVector, focalVector);
  crossVector.Normalize();

  //now we have the current orientation so we can adapt it according to the current information, which we got from the TDMouse

  //new position of the camera: 
  //left/right = camPosition + crossVector * translation[0];
  mitk::Vector3D vectorX = crossVector * -translation[0]; //changes the magnitude, not the direction
  double nextCamPosition[3];
  nextCamPosition[0] = camPosition[0] + vectorX[0];
  nextCamPosition[1] = camPosition[1] + vectorX[1];
  nextCamPosition[2] = camPosition[2] + vectorX[2];

  //now the up/down movement
  mitk::Vector3D vectorY = upCamVector * translation[1]; //changes the magnitude, not the direction
  nextCamPosition[0] += vectorY[0];
  nextCamPosition[1] += vectorY[1];
  nextCamPosition[2] += vectorY[2];

  //forward/backward movement
  mitk::Vector3D vectorZ = focalVector * -translation[2]; //changes the magnitude, not the direction
  nextCamPosition[0] += vectorZ[0];
  nextCamPosition[1] += vectorZ[1];
  nextCamPosition[2] += vectorZ[2];

  //set the next position
  double nextPosition[3];
  nextPosition[0] = nextCamPosition[0]; nextPosition[1] = nextCamPosition[1]; nextPosition[2] = nextCamPosition[2]; 
  vtkCam->SetPosition(nextPosition);

  //adapt the focal point the same way
  double currentFocalPoint[3], nextFocalPoint[3];
  vtkCam->GetFocalPoint(currentFocalPoint);
  nextFocalPoint[0] = currentFocalPoint[0] + vectorX[0] + vectorY[0] + vectorZ[0]; 
  nextFocalPoint[1] = currentFocalPoint[1] + vectorX[1] + vectorY[1] + vectorZ[1]; ; 
  nextFocalPoint[2] = currentFocalPoint[2] + vectorX[2] + vectorY[2] + vectorZ[2]; 
  vtkCam->SetFocalPoint(nextFocalPoint);


  //now adapt the rotation of the mouse and adapt the camera according to it

  //Pitch:
  //Rotate the focal point about the cross product of the view up vector and the direction of 
  //projection, centered at the camera's position.
  vtkCam->Pitch(rotation[0]*angle);

  //Yaw: 
  //Rotate the focal point about the view up vector centered at the camera's position. 
  //Note that the view up vector is not necessarily perpendicular to the direction of projection.
  vtkCam->Yaw(rotation[1]*angle);

  //Roll:
  //Rotate the camera about the direction of projection.
  vtkCam->Roll(-rotation[2]*angle * 1.5);//*1.5 to speed up the rotation[2] a little bit

  //Recompute the ViewUp vector to force it to be perpendicular to camera->focalpoint vector. 
  //Unless you are going to use Yaw or Azimuth on the camera, there is no need to do this.
  vtkCam->OrthogonalizeViewUp();

  //no zooming, only translating to the front or back
  // dolly: Move the position of the camera along the direction 
  // of projection. Moving towards the focal point (e.g., greater 
  // than 1) is a dolly-in, moving away from the focal point 
  // (e.g., less than 1) is a dolly-out.
  //double distance = ((tdevent->GetTranslation())[1] / 10.0);//make it less sensitive in comparison to translation and rotatipn
  //vtkCam->Dolly(1.0 + distance );


  //Reset the camera clipping range based on the bounds of the visible actors. 
  //This ensures that no props are cut off
  vtkRenderer->ResetCameraClippingRange();

  mitk::RenderingManager::GetInstance()->ForceImmediateUpdate(mitk::GlobalInteraction::GetInstance()->GetFocus()->GetRenderWindow());

  return true;
}
bool mitk::SpaceNavigatorVtkCameraController::OnSpaceNavigatorKeyDown ( mitk::Action a,
const mitk::StateEvent e 
) [virtual]

Definition at line 218 of file mitkSpaceNavigatorVtkCameraController.cpp.

References mitk::DataStorage::ComputeBoundingBox(), mitk::RenderingManager::GetInstance(), mitk::BaseRenderer::GetVtkRenderer(), and mitk::RenderingManager::RequestUpdateAll().

Referenced by SpaceNavigatorVtkCameraController().

{
  //reset the camera, so that the objects shown in the scene can be seen.
  const mitk::VtkPropRenderer* glRenderer = dynamic_cast<const mitk::VtkPropRenderer*>(m_Renderer);
  if (glRenderer)
  {
    vtkRenderer* vtkRenderer = glRenderer->GetVtkRenderer();
    mitk::DataStorage* ds = m_Renderer->GetDataStorage();
    if (ds == NULL)
      return false;

    mitk::BoundingBox::Pointer bb = ds->ComputeBoundingBox();

    mitk::Point3D middle =bb->GetCenter();
    vtkRenderer->GetActiveCamera()->SetFocalPoint(middle[0],middle[1],middle[2]);

    vtkRenderer->ResetCamera();
    mitk::RenderingManager::GetInstance()->RequestUpdateAll();
    return true;
  }
  return false;
}

Member Data Documentation


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines