在VTK中,默认旋转是转动摄像机,公司有不想转动摄像机而是只转动显示的Actor的业务。
需要去重写vtkInteractorStyleTrackballCamera这个类,具体如下:
//头文件
class CustomInteractorStyle :public vtkInteractorStyleTrackballCamera
//主要是重写这三个函数
virtual void OnMouseMove() override;
virtual void OnLeftButtonDown() override;
virtual void OnLeftButtonUp() override;
//源文件
void CustomInteractorStyle::OnLeftButtonUp()
{
m_LDown = false;
vtkInteractorStyleTrackballCamera::OnLeftButtonUp();
}
void CustomInteractorStyle::OnMouseMove()
{
if (!m_LDown) //没有按下鼠标左键
{
vtkInteractorStyleTrackballCamera::OnMouseMove();
return;
}
int X = this->Interactor->GetEventPosition()[0];
int Y = this->Interactor->GetEventPosition()[1];
int deltX = X - m_nOldMousePosX;
int deltY = Y - m_nOldMousePosY;
if (abs(deltX) > 10 || abs(deltY) > 10)
{
m_nOldMousePosX = X;
m_nOldMousePosY = Y;
}
double rotationCenter[3] = { 0.0,0.0,0.0 }; // 旋转中心点
for (int i = 0;i < m_pSelectedActor.size() ; ++i)
{
if (m_pSelectedActor[i] == nullptr) {
continue;
}
double angleX = deltY;
double angleY = deltX;
if (!m_pRotationTransform[i])
{
m_pRotationTransform[i] = vtkSmartPointer<vtkTransform>::New();
m_pRotationTransform[i]->Identity();
}
m_pRotationTransform[i]->Translate(rotationCenter[0], rotationCenter[1], rotationCenter[2]);
m_pRotationTransform[i]->RotateX(angleX);
m_pRotationTransform[i]->RotateY(angleY);
m_pRotationTransform[i]->Translate(-rotationCenter[0], -rotationCenter[1], -rotationCenter[2]);
m_pSelectedActor[i]->SetUserTransform(m_pRotationTransform[i]);
}
m_nOldMousePosX = X; //记录之前鼠标的位置
m_nOldMousePosY = Y;
this->Interactor->GetRenderWindow()->Render();
}
void CustomInteractorStyle::OnLeftButtonDown()
{
m_LDown = true;
//获取当前显示界面中所有的vtkActor
vtkSmartPointer<vtkPropCollection> propCollection = this->Interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer()->GetViewProps();
propCollection->InitTraversal();
vtkProp* prop = nullptr;
int pickNum = propCollection->GetNumberOfItems();
m_pRotationTransform.resize(pickNum);
m_pSelectedActor.clear();
while (pickNum > 0)
{
prop = propCollection->GetNextProp();
vtkProp3D* pActor = vtkProp3D::SafeDownCast(prop);
m_pSelectedActor.push_back(vtkActor::SafeDownCast(pActor));
pickNum--;
}
this->Interactor->GetRenderWindow()->Render();
m_nOldMousePosX = this->Interactor->GetEventPosition()[0];
m_nOldMousePosY = this->Interactor->GetEventPosition()[1];
vtkInteractorStyleTrackballCamera::OnLeftButtonDown();
}
觉得有用的话就点个赞吧。