前言
VTK的交互除了可以监听来自鼠标、键盘等外部设备的消息,还可以在渲染场景中生成功能各异的交互部件(Widget),用于控制可化过程的参数,达到用户渲染要求
本文参考了VTK交互之vtkCommand
本次主要想实现的是鼠标的交互事件
方法
1、定义回调函数
void MyCallbackFunc(vtkObject* obj, unsigned long eid, void* clientdata, void* calldata)
{
//Todo
}
2、创建一个vtkCallbackCommand对象,并调用vtkCallbackCommand::SetCallback()函数设置所定义的回调函数
//创建一个vtkCallbackCommand
vtkSmartPointer<vtkCallbackCommand> mouseCallback = vtkSmartPointer<vtkCallbackCommand>::New();
//将回调函数func放进去
mouseCallback->SetCallback(MyCallbackFunc);
3、将vtkCallbackCommand对象添加到主题对象的观察者列表中
vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
//vtkCallbackCommand对象添加到主题对象的观察者列表中
interactor->AddObserver(vtkCommand::LeftButtonPressEvent, mouseCallback);
代码实现
CMakeLists.txt文件代码如下:
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT(CallbackFunction)
FIND_PACKAGE(VTK REQUIRED)
INCLUDE(${VTK_USE_FILE})
ADD_EXECUTABLE(CallbackFunction CallbackFunction.cpp)
TARGET_LINK_LIBRARIES(CallbackFunction ${VTK_LIBRARIES})
CallbackFunction.cpp文件代码如下:
#include <vtkSmartPointer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkCallbackCommand.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkCylinderSource.h>
#include <vtkConeSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkProperty.h>
long pressCounts = 0;
//第一步,定义回调函数。注意回调函数的签名,不能更改。
void MyCallbackFunc(vtkObject*, unsigned long eid, void* clientdata, void *calldata)
{
//输出鼠标点击的次数
std::cout<<"You have clicked: "<<++pressCounts<<" times."<<std::endl;
}
int main()
{
vtkSmartPointer<vtkCylinderSource> cylinder = vtkSmartPointer<vtkCylinderSource>::New();
cylinder->SetHeight( 5.0 );
cylinder->SetRadius( 2.0 );
cylinder->SetResolution( 10 );
vtkSmartPointer<vtkPolyDataMapper> cylinderMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
cylinderMapper->SetInputConnection( cylinder->GetOutputPort() );
vtkSmartPointer<vtkActor> cylinderActor = vtkSmartPointer<vtkActor>::New();
cylinderActor->SetMapper( cylinderMapper );
cylinderActor->GetProperty()->SetColor(1.0, 0.0, 0.0);
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
renderer->AddActor( cylinderActor );
renderer->SetBackground( 1.0, 1.0, 1.0 );
vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();
renWin->AddRenderer( renderer );
renWin->SetSize( 640, 480 );
renWin->Render();
renWin->SetWindowName("Observer-Callback");
vtkSmartPointer<vtkRenderWindowInteractor> interactor =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
interactor->SetRenderWindow(renWin);
//第二步,创建一个vtkCallbackCommand对象
vtkSmartPointer<vtkCallbackCommand> mouseCallback =
vtkSmartPointer<vtkCallbackCommand>::New();
mouseCallback->SetCallback (MyCallbackFunc );
//第三步,将vtkCallbackCommand对象添加到观察者列表
//鼠标左键按下时 将调用前面定义的回调函数
interactor->AddObserver(vtkCommand::LeftButtonPressEvent, mouseCallback);
//值得注意的是 VTK 不能写成
//interactor->AddObserver(vtkCommand::LeftButtonPressEvent, MyCallbackFunc);
//必须得是 定义回调函数->vtkCallbackCommand对象->添加vtkCallbackCommand对象
//中间得要隔着vtkCallbackCommand对象
interactor->Initialize();
interactor->Start();
return EXIT_SUCCESS;
}