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的聯繫
//……
}
上述代碼片段中,callback function是主要的調用方式。其中caller是調用該callback function的對象,通常是RenderWindowInteractor,或者其他VTKWidget類;eventId是處理的event代號;clientData是傳遞到該函數中的數據;callData是隨着觸發的event一起傳遞的數據。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
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