vtk-based camera controller More...
#include <mitkSpaceNavigatorVtkCameraController.h>


Public Types | |
| typedef SpaceNavigatorVtkCameraController | Self |
| typedef CameraController | Superclass |
| typedef itk::SmartPointer< Self > | Pointer |
| 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 |
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.
| typedef itk::SmartPointer<const Self> mitk::SpaceNavigatorVtkCameraController::ConstPointer |
Reimplemented from mitk::StateMachine.
Definition at line 42 of file mitkSpaceNavigatorVtkCameraController.h.
| typedef itk::SmartPointer<Self> mitk::SpaceNavigatorVtkCameraController::Pointer |
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.
| mitk::SpaceNavigatorVtkCameraController::SpaceNavigatorVtkCameraController | ( | ) | [protected] |
Default Constructor
Definition at line 36 of file mitkSpaceNavigatorVtkCameraController.cpp.
References mitk::AcONPACENAVIGATORKEYDOWN, mitk::AcONSPACENAVIGATORMOUSEINPUT, CONNECT_ACTION, m_ClippingRangeIsSet, OnSpaceNavigatorEvent(), and OnSpaceNavigatorKeyDown().
: CameraController("SpaceNavigatorInteraction") { //connect method this->OnSpaceNavigatorEvent to StateMachineEventMechanism CONNECT_ACTION(AcONSPACENAVIGATORMOUSEINPUT, OnSpaceNavigatorEvent); CONNECT_ACTION(AcONPACENAVIGATORKEYDOWN, OnSpaceNavigatorKeyDown); m_ClippingRangeIsSet = false; }
| mitk::SpaceNavigatorVtkCameraController::~SpaceNavigatorVtkCameraController | ( | ) | [protected, virtual] |
| 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;
}
bool mitk::SpaceNavigatorVtkCameraController::m_ClippingRangeIsSet [protected] |
Definition at line 60 of file mitkSpaceNavigatorVtkCameraController.h.
Referenced by SpaceNavigatorVtkCameraController().
1.7.2