VTK:尝试使用 vtkrubberbandpick&vtkHardwareSelector 选择区域中的可见单元格

VTK: Trying to select visible cells in area with vtkrubberbandpick & vtkHardwareSelector

本文关键字:区域 选择 单元格 vtkHardwareSelector vtkrubberbandpick VTK      更新时间:2023-10-16

我正在尝试使用 vtkInteractorStyleRubberBandPick 的子类对对象上的可见单元格进行区域选取。我已经让一切正常,除了一个问题:如果我改变相机的视角,选择就不再正常工作。它只是在物体上挑选看似随机的单元格,而不是橡皮筋内的单元格。

我的 InteractorStyle 中的 LeftButtonUp 基本上是这样的:

vtkSmartPointer<vtkHardwareSelector> selector = vtkSmartPointer<vtkHardwareSelector>::New();
selector->SetRenderer(this->Interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer());
unsigned int windowSize[4];
windowSize[0] = StartPosition[0] < EndPosition[0] ? StartPosition[0] : EndPosition[0]; // xmin
windowSize[1] = StartPosition[1] < EndPosition[1] ? StartPosition[1] : EndPosition[1]; // ymin
windowSize[2] = StartPosition[0] < EndPosition[0] ? EndPosition[0] : StartPosition[0]; // xmax
windowSize[3] = StartPosition[1] < EndPosition[1] ? EndPosition[1] : StartPosition[1]; // ymax
selector->SetArea(windowSize);
selector->SetFieldAssociation(vtkDataObject::FIELD_ASSOCIATION_CELLS);
selector->CaptureBuffers();
vtkSmartPointer<vtkSelection> selection = selector->GenerateSelection();

vtkSmartPointer<vtkExtractSelection> extractSelection = vtkSmartPointer<vtkExtractSelection>::New();
extractSelection->SetInputData(0, actor->GetMapper()->GetInput());
extractSelection->SetInputData(1, selection);
extractSelection->Update();
vtkSmartPointer<vtkUnstructuredGrid> selected = vtkSmartPointer<vtkUnstructuredGrid>::New();
selected->ShallowCopy(extractSelection->GetOutput());
_faceSelectMapper->SetInputData(selected);

我需要在某个地方进行某种转换吗?我是否需要以某种方式更新硬件选择器?我到处搜索过,但我不知所措...

由于通过数据影响的剪切窗口部分正在发生变化,因此每次更改相机方向时都会获得不同的结果。您需要检查模式是选择还是方向,如下所示

#define VTKISRBP_ORIENT 0
#define VTKISRBP_SELECT 1
if(this->CurrentMode == VTKISRBP_SELECT){
// interactor codes...
}

https://www.vtk.org/Wiki/VTK/Examples/Cxx/Picking/HighlightSelection