vtk事件響應機制

vtk中大致有三種時間響應機制:

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

  1. 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;
	}

};

參考文檔:

  1. http://www.vtk.org/Wiki/VTK/Tutorials/Callbacks 
  2. http://www.vtk.org/Wiki/VTK/Examples/Cxx/Interaction/DoubleClick 
  3. http://www.cs.rpi.edu/~cutler/classes/visualization/F10/lectures/03_interaction.pdf
  4. http://www.vtk.org/Wiki/VTK/Examples/Cxx/Interaction/KeypressObserver



發佈了46 篇原創文章 · 獲贊 18 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章