【VTK】vtkPropPicker与vtkPicker(vtkPointPicker、vtkAreaPicker)使用总结

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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值