0
点赞
收藏
分享

微信扫一扫

vtkImagePlaneWidget vtkPlaneWidget 对象的平移,旋转


由于它是和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 是一样的,不再重复。


举报

相关推荐

0 条评论