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()函数中设计拾取调用流程