由于它是和plane 相关的类,原来平移,旋转都是依赖鼠标完成的,如果我们是通过其它方式完成的话,它实际数据并没有动。这就有问题了。
怎么办,其实它也提供了方法
1平移
有时候希望对plane进行平移,使其中心点移动到指定的位置。vtkImagePlaneWidget并没有提供直接的plane平移方法,只能通过间接的方式来实现。根据参考资料[1]的提示,下面总结了实现平移的代码:
double selPt[3] = {1, 0, 0}; // 平移的目标位置
double center[3];
imagePlaneWidget->GetCenter( center );
vtkSmartPointer <vtkTransform> transform =
vtkSmartPointer <vtkTransform>::New();
transform->Translate( selPt[0] - center[0],
selPt[1] - center[1],
selPt[2] - center[2]);
// Modify and update planeWidget
double newpt[3];
transform->TransformPoint( imagePlaneWidget->GetPoint1(), newpt );
imagePlaneWidget->SetPoint1( newpt );
transform->TransformPoint( imagePlaneWidget->GetPoint2(), newpt );
imagePlaneWidget->SetPoint2( newpt );
transform->TransformPoint( imagePlaneWidget->GetOrigin(), newpt );
imagePlaneWidget->SetOrigin( newpt );
imagePlaneWidget->UpdatePlacement();
2 旋转
vtkActor * mProp3DSec = m_pPlaneSecWidget->GetPlaneActor();
double * newCenter = m_pPlaneSecWidget->GetPlaneActor()->GetCenter();
vtkSmartPointer<vtkTransform> transformN = vtkSmartPointer<vtkTransform>::New();
//另一种方式 通过操作 GetPlaneActor ,最后得到 GetMatrix,再直接转成 vtkTransform
//transformN->SetMatrix(mProp3DSec->GetMatrix());
transformN->Translate(newCenter[0] ,
newCenter[1] ,
newCenter[2] );
transformN->RotateY(10);
transformN->Translate(-(newCenter[0] ),
-(newCenter[1] ),
-(newCenter[2] ));
transformN->Update();
// Modify and update planeWidget
double newpt[3];
transform->TransformPoint(planeWidget->GetPoint1(), newpt);
planeWidget->SetPoint1(newpt);
transform->TransformPoint(planeWidget->GetPoint2(), newpt);
planeWidget->SetPoint2(newpt);
transform->TransformPoint(planeWidget->GetOrigin(), newpt);
planeWidget->SetOrigin(newpt);
planeWidget->UpdatePlacement();
有时候我们希望设定plane的法向量,这可以通过旋转来实现。
double normal[3];
imagePlaneWidget->GetNormal( normal );
double dir[3] = {1, 1, 0};
double axis[3];
double angle = vtkMath::AngleBetweenVectors(normal, dir) / vtkMath::Pi() * 180;
vtkMath::Cross( normal, dir, axis );
transform->RotateWXYZ(angle, axis);
// Modify and update planeWidget
double newpt[3];
transform->TransformPoint( imagePlaneWidget->GetPoint1(), newpt );
imagePlaneWidget->SetPoint1( newpt );
transform->TransformPoint( imagePlaneWidget->GetPoint2(), newpt );
imagePlaneWidget->SetPoint2( newpt );
transform->TransformPoint( imagePlaneWidget->GetOrigin(), newpt );
imagePlaneWidget->SetOrigin( newpt );
imagePlaneWidget->UpdatePlacement();
vtkPlaneWidget 是一样的,不再重复。