vtk基础01

来源:互联网 发布:常州电子软件研发 编辑:程序博客网 时间:2024/05/29 12:34

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;}