Go to the documentation of this file.00001 #include "mitkWiiMoteVtkCameraController.h"
00002
00003 #include "mitkGlobalInteraction.h"
00004 #include "mitkInteractionConst.h"
00005 #include "mitkStateEvent.h"
00006
00007 #include "mitkBaseRenderer.h"
00008 #include "mitkVtkPropRenderer.h"
00009 #include "vtkRenderer.h"
00010 #include "vtkCamera.h"
00011
00012
00013
00014
00015 const double CALIBRATIONFACTORY = 0.125;
00016 const double CALIBRATIONFACTORX = 0.125;
00017
00018
00019 const double XMIN = 0;
00020 const double XMAX = 1024;
00021 const double YMIN = 0;
00022 const double YMAX = 768;
00023
00024 mitk::WiiMoteVtkCameraController::WiiMoteVtkCameraController()
00025 : CameraController("WiiMoteInteraction")
00026 , m_ClippingRangeIsSet(false)
00027 , m_SensitivityXMIN (XMAX)
00028 , m_SensitivityXMAX (XMIN)
00029 , m_SensitivityYMIN (YMAX)
00030 , m_SensitivityYMAX (YMIN)
00031 , m_SensitivityX (0)
00032 , m_SensitivityY (0)
00033 , m_Calibrated (false)
00034 {
00035 CONNECT_ACTION(mitk::AcONWIIMOTEINPUT, OnWiiMoteInput);
00036 CONNECT_ACTION(mitk::AcRESETVIEW, ResetView);
00037 CONNECT_ACTION(mitk::AC_INIT, InitCalibration);
00038 CONNECT_ACTION(mitk::AcCHECKPOINT, Calibration);
00039 CONNECT_ACTION(mitk::AcFINISH, FinishCalibration);
00040 }
00041
00042 mitk::WiiMoteVtkCameraController::~WiiMoteVtkCameraController()
00043 {
00044 }
00045
00046 bool mitk::WiiMoteVtkCameraController::OnWiiMoteInput(mitk::Action* a, const mitk::StateEvent* e)
00047 {
00048
00049 const mitk::BaseRenderer* br = mitk::GlobalInteraction::GetInstance()->GetFocus();
00050 this->SetRenderer( br );
00051 mitk::BaseRenderer::MapperSlotId id = ((mitk::BaseRenderer*)(br))->GetMapperID();
00052 if (id != mitk::BaseRenderer::Standard3D)
00053 return true;
00054
00055
00056 if (this->GetRenderer() != mitk::GlobalInteraction::GetInstance()->GetFocus())
00057 return true;
00058
00059
00060 vtkRenderer* vtkRenderer = ((mitk::VtkPropRenderer*)this->GetRenderer())->GetVtkRenderer();
00061 if (vtkRenderer == NULL)
00062 return false;
00063
00064 vtkCamera* vtkCam = (vtkCamera*)vtkRenderer->GetActiveCamera();
00065
00066
00067 if(!m_ClippingRangeIsSet)
00068 vtkCam->SetClippingRange(0.1, 1000);
00069
00070 const mitk::WiiMoteIREvent* WiiMoteIREvent;
00071
00072 if(!(WiiMoteIREvent = dynamic_cast<const mitk::WiiMoteIREvent*>(e->GetEvent())))
00073 {
00074 MITK_ERROR << "Not a WiiMote Event!";
00075 return false;
00076 }
00077
00078
00079 mitk::Vector2D tempMovementVector(WiiMoteIREvent->GetMovementVector());
00080 float inputCoordinates[3] = {tempMovementVector[0],tempMovementVector[1], 0};
00081 mitk::Vector3D movementVector(inputCoordinates);
00082
00083
00084 double sceneSensivity = 1.0;
00085
00086 mitk::DataStorage* ds = m_Renderer->GetDataStorage();
00087 mitk::BoundingBox::Pointer bb = ds->ComputeBoundingBox();
00088 mitk::BoundingBox::AccumulateType length = bb->GetDiagonalLength2();
00089 if (length > 0.00001)
00090 sceneSensivity *= 100.0 / (sqrt(length)) ;
00091
00092
00093 movementVector *= sceneSensivity;
00094
00095 if(!m_Calibrated)
00096 {
00097 movementVector[0] *= CALIBRATIONFACTORX;
00098 movementVector[1] *= CALIBRATIONFACTORY;
00099 }
00100 else
00101 {
00102 movementVector[0] *= m_SensitivityX;
00103 movementVector[1] *= m_SensitivityY;
00104 }
00105
00106
00107
00108 movementVector[1] *= -1;
00109 vtkCam->Elevation((double)movementVector[1]);
00110 vtkCam->Azimuth((double)movementVector[0]);
00111
00114
00115
00116
00117
00118
00120
00121
00122
00123
00124
00125
00127
00128
00129
00130
00131
00132
00133
00134
00136
00137
00138
00139
00141
00144
00145
00146
00147
00148
00149
00151
00152
00153
00154
00155
00157
00158
00159
00160
00161
00163
00164
00165
00166
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177 vtkRenderer->ResetCameraClippingRange();
00178
00179 mitk::RenderingManager::GetInstance()->ForceImmediateUpdate(mitk::GlobalInteraction::GetInstance()->GetFocus()->GetRenderWindow());
00180
00181 return true;
00182 }
00183
00184 bool mitk::WiiMoteVtkCameraController::ResetView(mitk::Action *a, const mitk::StateEvent *e)
00185 {
00186
00187 const mitk::VtkPropRenderer* glRenderer = dynamic_cast<const mitk::VtkPropRenderer*>(m_Renderer);
00188 if (glRenderer)
00189 {
00190 vtkRenderer* vtkRenderer = glRenderer->GetVtkRenderer();
00191 mitk::DataStorage* ds = m_Renderer->GetDataStorage();
00192 if (ds == NULL)
00193 return false;
00194
00195 mitk::BoundingBox::Pointer bb = ds->ComputeBoundingBox();
00196
00197 mitk::Point3D middle = bb->GetCenter();
00198 vtkRenderer->GetActiveCamera()->SetFocalPoint(middle[0],middle[1],middle[2]);
00199
00200 vtkRenderer->ResetCamera();
00201 mitk::RenderingManager::GetInstance()->RequestUpdateAll();
00202 return true;
00203 }
00204 return false;
00205 }
00206
00207 bool mitk::WiiMoteVtkCameraController::InitCalibration(mitk::Action *a, const mitk::StateEvent *e)
00208 {
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218 m_SensitivityX = 0;
00219 m_SensitivityXMAX = XMIN;
00220 m_SensitivityXMIN = XMAX;
00221 m_SensitivityY = 0;
00222 m_SensitivityYMAX = YMIN;
00223 m_SensitivityYMIN = YMAX;
00224
00225 this->m_Calibrated = false;
00226 MITK_INFO << "Starting calibration - other wiimote functionality deactivated.";
00227 return true;
00228 }
00229
00230 bool mitk::WiiMoteVtkCameraController::Calibration(mitk::Action *a, const mitk::StateEvent *e)
00231 {
00232 const mitk::WiiMoteCalibrationEvent* WiiMoteCalibrationEvent;
00233
00234 if(!(WiiMoteCalibrationEvent = dynamic_cast<const mitk::WiiMoteCalibrationEvent*>(e->GetEvent())))
00235 {
00236 MITK_ERROR << "Not a WiiMote Event!";
00237 return false;
00238 }
00239
00240 double tempX(WiiMoteCalibrationEvent->GetXCoordinate());
00241 double tempY(WiiMoteCalibrationEvent->GetYCoordinate());
00242
00243 MITK_INFO << "Raw X: " << tempX;
00244 MITK_INFO << "Raw Y: " << tempY;
00245
00246
00247 if(XMIN < tempX && tempX < XMAX)
00248 {
00249 if(tempX > m_SensitivityXMAX)
00250 {
00251 m_SensitivityXMAX = tempX;
00252 }
00253 else if(tempX < m_SensitivityXMIN)
00254 {
00255 m_SensitivityXMIN = tempX;
00256 }
00257 }
00258
00259 if(YMIN < tempY && tempY < YMAX)
00260 {
00261 if(tempY > m_SensitivityYMAX)
00262 {
00263 m_SensitivityYMAX = tempY;
00264 }
00265 else if(tempY < m_SensitivityYMIN)
00266 {
00267 m_SensitivityYMIN = tempY;
00268 }
00269 }
00270
00271 return true;
00272 }
00273
00274 bool mitk::WiiMoteVtkCameraController::FinishCalibration(mitk::Action *a, const mitk::StateEvent *e)
00275 {
00276
00277
00278 if( m_SensitivityXMAX != XMIN && m_SensitivityXMIN != XMAX && m_SensitivityYMAX != YMIN && m_SensitivityYMIN != YMAX )
00279 {
00280
00281 m_SensitivityX = XMAX / (m_SensitivityXMAX - m_SensitivityXMIN);
00282 m_SensitivityX *= CALIBRATIONFACTORX;
00283
00284 m_SensitivityY = YMAX / (m_SensitivityYMAX - m_SensitivityYMIN);
00285 m_SensitivityY *= CALIBRATIONFACTORY;
00286
00287 this->m_Calibrated = true;
00288 }
00289
00290 if(!m_Calibrated)
00291 {
00292 MITK_INFO << "Calibration was unsuccesful - please repeat the process and move in all directions!";
00293 }
00294 else
00295 {
00296 MITK_INFO << "Ending calibration - other wiimote functionality reactivated.";
00297 }
00298
00299 return m_Calibrated;
00300 }
00301