第二种方法是写一个新的vtkCommand子类
class vtkMyCallback : public vtkCommand
{
public:
static vtkMyCallback *New() //静态构造函数
{ return new vtkMyCallback; }
<span style="white-space:pre"> </span>//设置椎体对象
void SetObject(vtkConeSource* cone)
{
m_Cone = cone;
}
<span style="white-space:pre"> </span>//虚函数 继承过来的,在这里要实现,因为父类是个纯虚函数,必须在子类实现
<span style="white-space:pre"> </span>//而且这个就是交互的函数
virtual void Execute(vtkObject *caller, unsigned long eventId, void* callData)
{
std::cout<<"Left button pressed.\n"
<<"The Height: "<<m_Cone->GetHeight()<<"\n"
<<"The Radius: "<<m_Cone->GetRadius()<<std::endl;
}
private:
vtkConeSource *m_Cone;
};
int main()
{
vtkSmartPointer<vtkConeSource> cone = vtkSmartPointer<vtkConeSource>::New();
cone->SetHeight( 3.0 );
cone->SetRadius( 1.0 );
cone->SetResolution( 10 );
vtkSmartPointer<vtkPolyDataMapper> coneMapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
coneMapper->SetInputConnection( cone->GetOutputPort() );
vtkSmartPointer<vtkActor> coneActor = vtkSmartPointer<vtkActor>::New();
coneActor->SetMapper( coneMapper );
vtkSmartPointer<vtkRenderer> ren1= vtkSmartPointer<vtkRenderer>::New();
ren1->AddActor( coneActor );
ren1->SetBackground( 1.0, 1.0, 1.0 );
vtkSmartPointer<vtkRenderWindow> renWin =
vtkSmartPointer<vtkRenderWindow>::New();
renWin->AddRenderer( ren1 );
renWin->SetSize( 640, 480 );
renWin->Render();
renWin->SetWindowName("ObserverCommandDemo2");
vtkSmartPointer<vtkRenderWindowInteractor> iren =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
iren->SetRenderWindow(renWin);
vtkSmartPointer<vtkInteractorStyleTrackballCamera> style =
vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
iren->SetInteractorStyle(style);
//实例化一个对象
vtkSmartPointer<vtkMyCallback> callback = vtkSmartPointer<vtkMyCallback>::New();
callback->SetObject(cone);//把椎体传进去
//添加观察者,这里和第一个方法类似,只不过第二个参数是自定义的对象
<span style="white-space:pre"> </span>//监听的事件(第一个参数)一旦发生,就去调用Execute()函数
iren->AddObserver(vtkCommand::LeftButtonPressEvent, callback);
iren->Initialize();
iren->Start();
return EXIT_SUCCESS;
}