------------------------------------------------------------------------------
| 293 | |
| 294 | //------------------------------------------------------------------------------ |
| 295 | void vtkInteractorStyleTrackballActor::Spin() |
| 296 | { |
| 297 | if (this->CurrentRenderer == nullptr || this->InteractionProp == nullptr) |
| 298 | { |
| 299 | return; |
| 300 | } |
| 301 | |
| 302 | vtkRenderWindowInteractor* rwi = this->Interactor; |
| 303 | vtkCamera* cam = this->CurrentRenderer->GetActiveCamera(); |
| 304 | |
| 305 | // Get the axis to rotate around = vector from eye to origin |
| 306 | |
| 307 | double* obj_center = this->InteractionProp->GetCenter(); |
| 308 | |
| 309 | double motion_vector[3]; |
| 310 | double view_point[3]; |
| 311 | |
| 312 | if (cam->GetParallelProjection()) |
| 313 | { |
| 314 | // If parallel projection, want to get the view plane normal... |
| 315 | cam->ComputeViewPlaneNormal(); |
| 316 | cam->GetViewPlaneNormal(motion_vector); |
| 317 | } |
| 318 | else |
| 319 | { |
| 320 | // Perspective projection, get vector from eye to center of actor |
| 321 | cam->GetPosition(view_point); |
| 322 | motion_vector[0] = view_point[0] - obj_center[0]; |
| 323 | motion_vector[1] = view_point[1] - obj_center[1]; |
| 324 | motion_vector[2] = view_point[2] - obj_center[2]; |
| 325 | vtkMath::Normalize(motion_vector); |
| 326 | } |
| 327 | |
| 328 | double disp_obj_center[3]; |
| 329 | |
| 330 | this->ComputeWorldToDisplay(obj_center[0], obj_center[1], obj_center[2], disp_obj_center); |
| 331 | |
| 332 | double newAngle = |
| 333 | vtkMath::DegreesFromRadians(atan2(rwi->GetEventPosition()[1] - disp_obj_center[1], |
| 334 | rwi->GetEventPosition()[0] - disp_obj_center[0])); |
| 335 | |
| 336 | double oldAngle = |
| 337 | vtkMath::DegreesFromRadians(atan2(rwi->GetLastEventPosition()[1] - disp_obj_center[1], |
| 338 | rwi->GetLastEventPosition()[0] - disp_obj_center[0])); |
| 339 | |
| 340 | double scale[3]; |
| 341 | scale[0] = scale[1] = scale[2] = 1.0; |
| 342 | |
| 343 | double** rotate = new double*[1]; |
| 344 | rotate[0] = new double[4]; |
| 345 | |
| 346 | rotate[0][0] = newAngle - oldAngle; |
| 347 | rotate[0][1] = motion_vector[0]; |
| 348 | rotate[0][2] = motion_vector[1]; |
| 349 | rotate[0][3] = motion_vector[2]; |
| 350 | |
| 351 | this->Prop3DTransform(this->InteractionProp, obj_center, 1, rotate, scale); |
| 352 |
no test coverage detected