以下例子是:
面绘制一个mhd文件,在设置 vesselExtractor->SetValue( 0 ,20)的第二个值时,沿用滑动条来观察结果;
如果你用在其他场景下,相应改变vtkSliderCallback中的参数和函数语句即可;
参考的博客原文:https://blog.csdn.net/u014003644/article/details/76724290
#include"vtkConeSource.h"
#include"vtkPolyDataMapper.h"
#include"vtkRenderWindow.h"
#include"vtkCamera.h"
#include"vtkActor.h"
#include"vtkRenderer.h"
#include"vtkRenderWindowInteractor.h"
#include"vtkInteractorStyleTrackballCamera.h"
#include"vtkCommand.h"
#include"vtkSliderWidget.h"
#include"vtkSliderRepresentation3D.h"
#include"vtkProperty.h"
#include"vtkLight.h"
class vtkSliderCallback :public vtkCommand
{
public:
static vtkSliderCallback *New()
{return new vtkSliderCallback; }
virtual void Execute(vtkObject*caller, unsigned long, void*)
{
vtkSliderWidget*sliderWidget = reinterpret_cast<vtkSliderWidget*>(caller);
this->vesselExtractor->SetValue( 0 ,static_cast<vtkSliderRepresentation*>
(sliderWidget->GetRepresentation())->GetValue());
}
vtkSliderCallback() :vesselExtractor(0){}
vtkMarchingCubes *vesselExtractor;
};
int main()
{
vtkSmartPointer<vtkMetaImageReader> Reader =vtkSmartPointer<vtkMetaImageReader>::New();
Reader->SetFileName("/Users/mac/Desktop/Hessian.mhd");
Reader->Update();
if (!Reader->GetOutputPort())
{
cout << "open failed" << endl;
}
vtkMarchingCubes *vesselExtractor = vtkMarchingCubes::New();
vesselExtractor->SetInputConnection(Reader->GetOutputPort());
vesselExtractor->SetNumberOfContours(1);
vesselExtractor->SetValue( 0 ,20); //面绘制设置的值,可改
vtkStripper *vesselStripper = vtkStripper::New();
vesselStripper->SetInputConnection(vesselExtractor->GetOutputPort());
vtkPolyDataMapper *vesselMapper = vtkPolyDataMapper::New();
vesselMapper->SetInputConnection(vesselStripper->GetOutputPort());
vesselMapper->SetScalarRange(0,2);
vtkActor *vessel = vtkActor::New();
vessel->SetMapper(vesselMapper);
vessel->GetProperty()->SetDiffuseColor(-4, -4, 0);
vessel->GetProperty()->SetSpecular(.3);
vessel->GetProperty()->SetSpecularPower(20);
vessel->GetProperty()->SetColor(1,0.75,0);
vessel->GetProperty()->SetOpacity(1);
vtkRenderer*ren1 = vtkRenderer::New();
ren1->AddActor(vessel);
ren1->SetBackground( 120, 120, 120 );
vtkRenderWindow*renWin = vtkRenderWindow::New();
renWin->AddRenderer(ren1);
renWin->SetSize(1000, 1000);
vtkRenderWindowInteractor*iren = vtkRenderWindowInteractor::New();//设定交互
iren->SetRenderWindow(renWin);
vtkInteractorStyleTrackballCamera *style = vtkInteractorStyleTrackballCamera::New();
iren->SetInteractorStyle(style);
//实例化vtkSliderRepresentation3D,并设置属性。该对象用做滑块在场景中的3D表示
vtkSliderRepresentation3D* sliderRep = vtkSliderRepresentation3D::New();
sliderRep->SetValue(30);
//滑动条两端的值,默认0-100
sliderRep->SetMinimumValue(0);
sliderRep->SetMaximumValue(100);
sliderRep->SetTitleText("vessel value");
//text position
sliderRep->GetPoint1Coordinate()->SetCoordinateSystemToWorld();
sliderRep->GetPoint1Coordinate()->SetValue(10, 10, 0);
sliderRep->GetPoint2Coordinate()->SetCoordinateSystemToWorld();
sliderRep->GetPoint2Coordinate()->SetValue(200, 10, 0);//Titletext的坐标
sliderRep->SetSliderLength(0.05);
sliderRep->SetSliderWidth(0.05);
sliderRep->SetEndCapLength(0.05);
vtkSliderWidget*sliderWidget = vtkSliderWidget::New();
sliderWidget->SetInteractor(iren);
sliderWidget->SetRepresentation(sliderRep);
sliderWidget->SetAnimationModeToAnimate();
sliderWidget->EnabledOn();//用于使用滑块
vtkSliderCallback* callback = vtkSliderCallback::New();
callback->vesselExtractor = vesselExtractor;
sliderWidget->AddObserver(vtkCommand::InteractionEvent, callback);
//vtkBoxWidget*boxWidget = vtkBoxWidget::New();//创建vtkBoxWidget实例
//boxWidget->SetInteractor(iren); // 设置交互器
//boxWidget->SetPlaceFactor(1.25); //设置缩放因子
//boxWidget->SetProp3D(coneActor);//关联一个道具
//boxWidget->PlaceWidget();//对位置初始化
vtkMyCallback*callback = vtkMyCallback::New();
//boxWidget->AddObserver(vtkCommand::InteractionEvent, callback);
//boxWidget->On();
iren->Initialize();
iren->Start();
return 0;
}