1.拾取
選擇拾取是人機互動過程的一個重要功能。 一個最經典的例子就是,在玩3D遊戲時,場景中可能會存在多個角色,有時需要用滑鼠來選擇所要控制的角色,這就要用到拾取功能。 另外,在某些三維圖形的編輯軟體中,經常需要編輯其中的一個點、一個面片或者一個局部區域,這也需要通過拾取功能來完成。 VTK中定義了多個拾取功能的類,具體的繼承關系如下:VTK中所有的拾取類都繼承自vtkAbstractPicker類,在這些類的基礎之上可以實作非常複雜的功能。![]()
VTK 互動與拾取_點拾取
2.點拾取
從上圖中能夠知曉,完成點拾取功能的類是vtkPointPicker。 vtk中的消息是通過vtkRenderWindowInteractor類處理的,在類vtkRenderWindowInteractor中,定義如下函數: virtual void SetPicker(vtkAbstractPicker* ); 該函數用來設定具體的VTKAbstractPicker對象,并執行相應的拾取操作。是以對于點拾取,實際就是設定VTKPointPicker的過程。 之前,曾經細緻的研究過,vtkRenderWindowInteractor内部定義了一個vtkInteractorStyle對象。vtkInteractorStyle類是一個虛基類,其子類定義了多種滑鼠和鍵盤消息的處理方法,在實作拾取操作是,需要定制相應的滑鼠消息處理函數。比如拾取某個點時,應該響應滑鼠的左鍵按下消息,并在響應該消息的函數中根據滑鼠的目前視窗坐标來完成拾取操作。 點拾取的示例代碼如下:
實際操作細節分析: vtkInteractorStyleTrackballCemera派生類設計 PointPickerInteractorStyle類從vtkInteractorStyleTrackballCemera派生,并覆寫了該類OnLeftButtonDown()函數。在該函數中,調用了vtkRenderWindowInteractor的GetEventPosition()函數輸出滑鼠點選的螢幕坐标。 拾取函數Pick()設計 int Pick(double selectionX, double selectionY, double selectionZ, vtkRender* renderer); 該函數需要接受四個參數,前三個為(selectionX,selectionY,selectionZ),即滑鼠的目前視窗坐标,其中selectionZ通常為零。最後一個是vtkRenderer對象。 GetPackPosition()是指世界坐标系下拾取點的坐标 mian()函數中設計拾取調用流程