拾取操作是可视化应用程序中常见的一种功能。拾取主要是用于选择数据和Actor或者获取底层的数据值。在显示位置(以像素为坐标值)中拾取时,就会调用vtkAbstractPicker的Pick()方法。依赖于所用的拾取类不同,拾取时返回的信息也不同,最简单的是返回一个x-y-z的全局坐标值,或者是单元(cell)的ID值,点的ID值,单元参数坐标(CellParametric Coordinates),所拾取的vtkProp实例,以及Assemblypath。与拾取相关的VTK类的 继承图如下:
本文内容主要介绍一下vtk拾取的实现方式,并不讲解每种拾取器的差别。本文拾取过程以vtkCellPicker为例子讲解。拾取的实现按照vtk交互方式的不同分为两大类:1)重写vtkInteractorStyle完成拾取 2)重写观察者命令模式完成拾取
1) 重写vtkInteractorStyle
class MouseInteractorStyle : public vtkInteractorStyleTrackballCamera
{
public:
static MouseInteractorStyle* New();
MouseInteractorStyle()
{
selectedMapper = vtkSmartPointer<vtkDataSetMapper>::New();
selectedActor = vtkSmartPointer<vtkActor>::New();
}
virtual void OnLeftButtonDown()
{
// Get the location of the click (in window coordinates)
int* pos = this->GetInteractor()->GetEventPosition();
vtkSmartPointer<vtkCellPicker> picker =
vtkSmartPointer<vtkCellPicker>::New();
picker->SetTolerance(0.0005);
// Pick from this