1、定义拾取工具vtkcellpicker并与交互器关联,代码如下:
vtkCellPicker *Picker = vtkCellPicker::SafeDownCast(iren->GetPicker());
2、进行拾取操作,同时获取显示窗口中的actor管理工具CurrentRenderer
vtkRenderer *CurrentRenderer = iren->FindPokedRenderer(x,y);
Picker->Pick(x, y, 0.0, CurrentRenderer);
3、逐个actor判断,判断是否存在选中的actor
vtkProp *prop = Picker->GetViewProp();
if (prop != NULL)
{
Picker->GetPickPosition( pickPos );//获得三维空间坐标点
double xp = pickPos[0];
double yp = pickPos[1];
double zp = pickPos[2];
int iSel = Picker->GetCellId();//获得选择的细胞编号
vtkActor* pA = (vtkActor*)Picker->GetActor();
vtkCell* pCell = pA->GetMapper()->GetInput()->GetCell(iSel);//提取选择的细胞单元指针
vtkPoints *mypoints = pCell->GetPoints();
int nid = mypoints->GetNumberOfPoints();//获得这个细胞拥有的点数
for (int i = 0; i < nid; i++)
{
double m[4];
m[3] = 1.0;
mypoints->GetPoint(i,m);//获得细胞内指定索引点的坐标值
CurrentRenderer->SetWorldPoint(m[0],m[1],m[2],m[3]);
CurrentRenderer->WorldToDisplay();
double ss[3];
CurrentRenderer->GetDisplayPoint(ss);
}
//TRACE("\n(%5.2f,%5.2f,%5.2f)",xp,yp,zp);
}