vtk交互(2)

第二种方法是写一个新的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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值