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