VTK:尝试使用vtkrubberbandpick& amp; vtkHardwareSelector

时间:2018-05-10 00:44:53

标签: c++ vtk

我正在尝试使用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);

我是否需要在某处进行某种转换?我是否需要以某种方式更新hardwareselector?我到处搜寻,但我不知所措......

1 个答案:

答案 0 :(得分:0)

由于剪切窗口影响的部分数据不断变化,因此每次更改相机方向都会得到不同的结果。您需要检查模式是下面的选择方向还是方向

#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