vtk中的对交互初步认识,widget有好几种方式,以下有两种,跟别是boxWidget(注释掉)和SliderWidget。通过观察者AddObserver(vtkCommand::InteractionEvent, callback)来回调函数; Execute是交互运行的关键,将调用对象转换为sliderWidget类型,然后从其相关联的表示对象中获取滑块的当前值,并用做漫反射系数。
#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"vtkBoxWidget.h" //#include"vtkTransform.h" #include"vtkSliderWidget.h" #include"vtkSliderRepresentation3D.h" #include"vtkProperty.h" #include"vtkLight.h" //class vtkMyCallback :public vtkCommand //{ //public: // static vtkMyCallback*New() // {return new vtkMyCallback; } // virtual void Execute(vtkObject*caller, unsigned long, void*) // { // vtkTransform*t = vtkTransform::New(); // vtkBoxWidget*widget = reinterpret_cast<vtkBoxWidget*>(caller); // widget->GetTransform(t); // widget->GetProp3D()->SetUserTransform(t); // t->Delete(); // } //}; 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->anActor->GetProperty()->SetDiffuse(static_cast<vtkSliderRepresentation*> (sliderWidget->GetRepresentation())->GetValue()); } vtkSliderCallback() :anActor(0){} vtkActor*anActor; }; int main() { vtkConeSource*cone = vtkConeSource::New(); cone->SetHeight(3.0); cone->SetRadius(1.0); cone->SetResolution(10); vtkPolyDataMapper*coneMapper = vtkPolyDataMapper::New(); coneMapper->SetInputConnection(cone->GetOutputPort()); vtkActor*coneActor = vtkActor::New(); coneActor->SetMapper(coneMapper); coneActor->GetProperty()->SetColor(1, 0, 0); coneActor->GetProperty()->SetAmbient(0.5); coneActor->GetProperty()->SetSpecular(0.0); vtkRenderer*ren1 = vtkRenderer::New(); ren1->AddActor(coneActor); ren1->SetBackground(0.1, 0.2, 0.4); //ren1->SetViewport(0.0, 0.0, 0.5, 1.0); vtkLight*light = vtkLight::New(); light->SetFocalPoint(0, 0, 0); light->SetPosition(-0 / 8, 0.8, 1); ren1->AddLight(light); vtkRenderWindow*renWin = vtkRenderWindow::New(); renWin->AddRenderer(ren1); //renWin->AddRenderer(ren2); renWin->SetSize(600, 300); /*ren1->ResetCamera(); ren1->GetActiveCamera()->Azimuth(90);*/ vtkRenderWindowInteractor*iren = vtkRenderWindowInteractor::New();//设定交互 iren->SetRenderWindow(renWin); vtkInteractorStyleTrackballCamera *style = vtkInteractorStyleTrackballCamera::New(); iren->SetInteractorStyle(style);//指定交互方式 //实例化vtkSliderRepresentation3D,并设置属性。该对象用做滑块在场景中的3D表示 vtkSliderRepresentation3D*sliderRep = vtkSliderRepresentation3D::New(); sliderRep->SetValue(0.5); sliderRep->SetTitleText("Diffuse value"); sliderRep->GetPoint1Coordinate()->SetCoordinateSystemToWorld(); sliderRep->GetPoint1Coordinate()->SetValue(-0.5, -0.8, 0); sliderRep->GetPoint2Coordinate()->SetCoordinateSystemToWorld(); sliderRep->GetPoint2Coordinate()->SetValue(0.5, -0.8, 0);//Titletext的坐标 sliderRep->SetSliderLength(0.075); 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->anActor = coneActor; 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; }