vtkNew<vtkHardwareSelector> selector ;
selector->SetRenderer(this->GetDefaultRenderer());
selector->SetFieldAssociation(vtkDataObject::FIELD_ASSOCIATION_CELLS);
selector->SetArea(min[0], min[1], max[0], max[1]);
vtkSelection* selection = selector->Select();
int num = selection->GetNumberOfNodes();
该方法拾取当前render显示的模型(透明度非0)的模型。如果要定向选择,还是需要使用vtkAeraPicker提取出框选的面片。如果需要可见,使用vtkSelectVisiblePoints 拾取,通过每个面片的顶点都可见即该面片可见。记得关闭vtkAreaPicker,并且关闭抗锯齿。
#include <unordered_set>
// 假设 array 是您存储顶点的数组
// 构建哈希集存储顶点
std::unordered_set<int> vertexSet;
for (vtkIdType k = 0; k < array->GetNumberOfTuples(); ++k) {
vertexSet.insert(array->GetValue(k));
}
for (int j = 0; j < selectAllCellPolyData->GetNumberOfCells(); j++) {
vtkCell* cellTmp = selectAllCellPolyData->GetCell(j);
int cellOriId = array3->GetValue(j);
const vtkIdType* pts = cellTmp->GetPointIds()->begin();
int oriId0 = array2->GetValue(pts[0]);
int oriId1 = array2->GetValue(pts[1]);
int oriId2 = array2->GetValue(pts[2]);
// 检查顶点是否都存在于哈希集中
if (vertexSet.count(oriId0) && vertexSet.count(oriId1) && vertexSet.count(oriId2)) {
InputData->at(i)->GetCellData()->GetArray("Colors")->SetTuple3(cellOriId, 255, 255, 255);
}
}