vtkPropPicker与vtkPicker(vtkPointPicker)使用总结
快速总结解决不同需求应该选取用哪个picker
区分
vtkPropPicker、vtkPicker与vtkAreaPicker都继承于同一个父类,所以可以视作他们是同辈的。而vtkPicker的两个重要子类是vtkPointPicker与vtkCellPointer。
vtkAreaPicker的作用很明显,能够提取区域内覆盖的顶点,通常搭配vtkInteractorStyleRubberBandPick交互方式使用,不会造成混淆,所以就不需要去做区分。
vtkPropPicker是基于硬件实现,而vtkPicker是基于软件实现,二者都能捕获到顶点坐标,但是获得的信息会有不同。因为vtkPointPicker与vtkCellPointer都是vtkPicker的子类,所以特性都可以直接看vtkPicker。
vtkPropPicker中的Prop指的是vtkRenderer中渲染显示的元素vtkProp,而其子类正是vtkActor。所以对于我们一般三维场景的使用,可以将vtkPropPicker狭义地视作是vtkActorPicker去理解,但是很怪的是它不能告诉你点击拾取的是哪个Actor。不过它可以告诉你当前是否正在从Actor上拾取点,因为用鼠标点击空白处是获取不到数据的。
而用vtkPicker时,鼠标点击空白处也是能获取到坐标数据的,不一定有用,也不一定准确,需要你自己去判断一下。不过vtkPicker能够告诉你当前拾取的哪个Actor,或者说哪个vtkPolyData数据。甚至使用vtkPointPicker与vtkCellPicker能够告诉你正在拾取的是哪个顶点ID和三角形ID。
该用哪个
- vtkPropPicker:能够提取鼠标点击的具体三维顶点坐标,该三维顶点指场景中模型表面的顶点坐标。意思是你想点击模型表面上某个点的三维坐标是什么,vtkPropPicker能够做到,也只能做到这里。注意:仅在点击vtkActor(或者说vtkProp)表面时生效,点击空白处只会获得(0, 0, 0)坐标。使用案例:在模型表面上加标记物。
- vtkPicker:能够知道鼠标点击是谁,能够提取点击的vtkPolyData和vtkActor数据,拿到他们的指针。使用案例:点击选中具体的模型。注意:vtkPicker不是虚拟类,有具体实现的,可以直接用的。
- vtkPointPicker:vtkPicker的子类,能够具体知道点击的顶点ID号。
- vtkCellPicker:能够具体指导点击的三角形ID号,实际使用会比vtkPointPicker更加耗时。
问题
Q: 既想知道选中的哪个vtkPolyData数据,又想知道具体点击的三维顶点坐标值,应该使用哪个Picker?
A:同时使用vtkPicker和vtkPropPicker来实现,使用vtkPicker来获取具体哪个模型数据,使用vtkPropPicker来获取三维顶点坐标值。
int x = this->Interactor->GetEventPosition()[0];
int y = this->Interactor->GetEventPosition()[1];
propPicker->Pick(x, y, 0, this->CurrentRenderer);
polyPicker->Pick(x, y, 0, this->CurrentRenderer);
//提取具体三维坐标点
double* pos = propPicker->GetPickPosition();
//提取具体Actor
vtkActor* actor = polyPicker->GetActor();