vtk基础01

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;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值