占坑
//vtkInteractorStyle
virtual void StartAnimate();
virtual void StopAnimate();
virtual void StartRotate();
virtual void EndRotate();
virtual void StartZoom();
virtual void EndZoom();
virtual void StartPan();
virtual void EndPan();
virtual void StartSpin();
virtual void EndSpin();
virtual void StartDolly();
virtual void EndDolly();
virtual void StartUniformScale();
virtual void EndUniformScale();
virtual void StartTimer();
virtual void EndTimer();
virtual void StartTwoPointer();
virtual void EndTwoPointer();
//vtkInteractorStyleTrackballCamera.h
void Rotate() override;
void Spin() override;
void Pan() override;
void Dolly() override;
//vtkInteractorStyleTrackballCamera.cpp
//----------------------------------------------------------------------------
void vtkInteractorStyleTrackballCamera::Rotate()
{
if (this->CurrentRenderer == nullptr)
{
return;
}
vtkRenderWindowInteractor *rwi = this->Interactor;
int dx = rwi->GetEventPosition()[0] - rwi->GetLastEventPosition()[0];
int dy = rwi->GetEventPosition()[1] - rwi->GetLastEventPosition()[1];
int *size = this->CurrentRenderer->GetRenderWindow()->GetSize();
double delta_elevation = -20.0 / size[1];
double delta_azimuth = -20.0 / size[0];
double rxf = dx * delta_azimuth * this->MotionFactor;
double ryf = dy * delta_elevation * this->MotionFactor;
vtkCamera *camera = this->CurrentRenderer->GetActiveCamera();
camera->Azimuth(rxf);
camera->Elevation(ryf);
camera->OrthogonalizeViewUp();
if (this->AutoAdjustCameraClippingRange)
{
this->CurrentRenderer->ResetCameraClippingRange();
}
if (rwi->GetLightFollowCamera())
{
this->CurrentRenderer->UpdateLightsGeometryToFollowCamera();
}
rwi->Render();
}
//----------------------------------------------------------------------------
void vtkInteractorStyleTrackballCamera::Spin()
{
if ( this->CurrentRenderer == nullptr )
{
return;
}
vtkRenderWindowInteractor *rwi = this->Interactor;
double *center = this->CurrentRenderer->GetCenter();
double newAngle =
vtkMath::DegreesFromRadians( atan2( rwi->GetEventPosition()[1] - center[1],
rwi->GetEventPosition()[0] - center[0] ) );
double oldAngle =
vtkMath::DegreesFromRadians( atan2( rwi->GetLastEventPosition()[1] - center[1],
rwi->GetLastEventPosition()[0] - center[0] ) );
vtkCamera *camera = this->CurrentRenderer->GetActiveCamera();
camera->Roll( newAngle - oldAngle );
camera->OrthogonalizeViewUp();
rwi->Render();
}
//----------------------------------------------------------------------------
void vtkInteractorStyleTrackballCamera::Pan()
{
if (this->CurrentRenderer == nullptr)
{
return;
}
vtkRenderWindowInteractor *rwi = this->Interactor;
double viewFocus[4], focalDepth, viewPoint[3];
double newPickPoint[4], oldPickPoint[4], motionVector[3];
// Calculate the focal depth since we'll be using it a lot
vtkCamera *camera = this->CurrentRenderer->GetActiveCamera();
camera->GetFocalPoint(viewFocus);
this->ComputeWorldToDisplay(viewFocus[0], viewFocus[1], viewFocus[2],
viewFocus);
focalDepth = viewFocus[2];
this->ComputeDisplayToWorld(rwi->GetEventPosition()[0],
rwi->GetEventPosition()[1],
focalDepth,
newPickPoint);
// Has to recalc old mouse point since the viewport has moved,
// so can't move it outside the loop
this->ComputeDisplayToWorld(rwi->GetLastEventPosition()[0],
rwi->GetLastEventPosition()[1],
focalDepth,
oldPickPoint);
// Camera motion is reversed
motionVector[0] = oldPickPoint[0] - newPickPoint[0];
motionVector[1] = oldPickPoint[1] - newPickPoint[1];
motionVector[2] = oldPickPoint[2] - newPickPoint[2];
camera->GetFocalPoint(viewFocus);
camera->GetPosition(viewPoint);
camera->SetFocalPoint(motionVector[0] + viewFocus[0],
motionVector[1] + viewFocus[1],
motionVector[2] + viewFocus[2]);
camera->SetPosition(motionVector[0] + viewPoint[0],
motionVector[1] + viewPoint[1],
motionVector[2] + viewPoint[2]);
if (rwi->GetLightFollowCamera())
{
this->CurrentRenderer->UpdateLightsGeometryToFollowCamera();
}
rwi->Render();
}
//----------------------------------------------------------------------------
void vtkInteractorStyleTrackballCamera::Dolly()
{
if (this->CurrentRenderer == nullptr)
{
return;
}
vtkRenderWindowInteractor *rwi = this->Interactor;
double *center = this->CurrentRenderer->GetCenter();
int dy = rwi->GetEventPosition()[1] - rwi->GetLastEventPosition()[1];
double dyf = this->MotionFactor * dy / center[1];
this->Dolly(pow(1.1, dyf));
}
//----------------------------------------------------------------------------
void vtkInteractorStyleTrackballCamera::Dolly(double factor)
{
if (this->CurrentRenderer == nullptr)
{
return;
}
vtkCamera *camera = this->CurrentRenderer->GetActiveCamera();
if (camera->GetParallelProjection())
{
camera->SetParallelScale(camera->GetParallelScale() / factor);
}
else
{
camera->Dolly(factor);
if (this->AutoAdjustCameraClippingRange)
{
this->CurrentRenderer->ResetCameraClippingRange();
}
}
if (this->Interactor->GetLightFollowCamera())
{
this->CurrentRenderer->UpdateLightsGeometryToFollowCamera();
}
this->Interactor->Render();
}