vtk中大致有三种时间响应机制:
- command/observer模式之callback function
vtk中的command/observer模式是最常用的,也是各种处理方式的基础。这里首先介绍如何使用callback function的方法:
- void KeyPressCallbackFunction ( vtkObject* caller, long unsigned int eventId, void* clientData, void* callData )
- {
- vtkRenderWindowInteractor *iren = static_cast<vtkRenderWindowInteractor*>(caller);// 指向调用这个callback函数的对象
- vtkBoxWidget *tempWidget = static_cast<vtkBoxWidget*>(clientData);
- tempWidget->GetTransform(inverse);
- vtkSmartPointer<vtkMyCallback> callback = vtkSmartPointer<vtkMyCallback>::New();
- tempWidget->AddObserver(vtkCommand::InteractionEvent, callback);
- std::cout << "Pressed: " << iren->GetKeySym() << std::endl;
- }
- int main()
- {
- //…
- vtkSmartPointer<vtkCallbackCommand> keyPressCallback = vtkSmartPointer<vtkCallbackCommand>::New();
- keyPressCallback->SetCallback(KeyPressCallbackFunction);
- keyPressCallback->SetClientData(boxWidget);
- iren->AddObserver(vtkCommand::KeyPressEvent, keyPressCallback); // 设置callback function和event的联系
- //……
- }
2.command/observer模式之vtkCommand
这种方法与第一种方法的原理相同,只不过这里使用不是一个callback function,而是继承了vtkCommand类来实现自己需要的操作。具体的代码如下:
- class vtkMyCallback : public vtkCommand
- {
- public:
- static vtkMyCallback *New()
- {
- return new vtkMyCallback;
- }
- virtual void Execute(vtkObject *caller, unsigned long, void*)
- {
- <span style="white-space:pre"> </span>vtkSmartPointer<vtkTransform> t = vtkSmartPointer<vtkTransform>::New();
- <span style="white-space:pre"> </span>vtkBoxWidget *widget = reinterpret_cast<vtkBoxWidget*>(caller);
- <span style="white-space:pre"> </span>widget->GetTransform(t);
- t->PreMultiply();
- t->Concatenate(vtkLinearTransform::SafeDownCast(inverse->GetInverse()));
- <span style="white-space:pre"> </span>widget->GetProp3D()->SetUserTransform(t);
- }
- };
- int main()
- {
- // …...
- vtkSmartPointer<vtkBoxWidget> boxWidget =
- vtkSmartPointer<vtkBoxWidget>::New();
- boxWidget->SetInteractor(iren);
- boxWidget->SetPlaceFactor(1.0);
- boxWidget->SetProp3D(coneActor);
- boxWidget->PlaceWidget();
- vtkSmartPointer<vtkMyCallback> callback =
- vtkSmartPointer<vtkMyCallback>::New();
- boxWidget->AddObserver(vtkCommand::InteractionEvent, callback);// 处理event和callback的联系
- boxWidget->On();
- //……
- }
- interactor style
第三种方法是继承已有的interactor style来对自己希望设置的事件作出对应的响应,该方法可以看作是对若干个event的集合,缺点是只能对RenderWindowInteractor进行设置。该方法的代码片段如下:
- class MyStyle : public vtkInteractorStyleImage
- {
- public:
- static MyStyle* New();
- vtkTypeMacro(MyStyle, vtkInteractorStyleImage);
- virtual void OnLeftButtonDown()
- {
- std::cout << "Pressed left mouse button." << std::endl;
- // Forward events
- vtkInteractorStyleImage::OnLeftButtonDown();
- }
- virtual void OnRightButtonDown()
- {
- std::cout << "Pressed right mouse button." << std::endl;
- }
- virtual void OnRightButtonUp()
- {
- std::cout << "Release right mouse button." << std::endl;
- }
- virtual void OnMouseMove()
- {
- int *pos = this->GetInteractor()->GetEventPosition();
- std::cout << pos[0] << " " << pos[1] << " " << pos[2] << std::endl;
- }
- virtual void OnLeftButtonUp()
- {
- std::cout << "Release right mouse button." << std::endl;
- }
- };
- http://www.vtk.org/Wiki/VTK/Tutorials/Callbacks
- http://www.vtk.org/Wiki/VTK/Examples/Cxx/Interaction/DoubleClick
- http://www.cs.rpi.edu/~cutler/classes/visualization/F10/lectures/03_interaction.pdf
- http://www.vtk.org/Wiki/VTK/Examples/Cxx/Interaction/KeypressObserver