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