当前位置:   article > 正文

VTK_Learning_交互与拾取_单位拾取_vtk 拾取 点云

vtk 拾取 点云

1.单位拾取

示例代码:

  1. #include <vtkAutoInit.h>
  2. VTK_MODULE_INIT(vtkRenderingOpenGL)
  3. VTK_MODULE_INIT(vtkInteractionStyle)
  4. VTK_MODULE_INIT(vtkRenderingFreeType)
  5. #include <vtkSmartPointer.h>
  6. #include <vtkSphereSource.h>
  7. #include <vtkPolyDataMapper.h>
  8. #include <vtkActor.h>
  9. #include <vtkProperty.h>
  10. #include <vtkRenderer.h>
  11. #include <vtkRenderWindow.h>
  12. #include <vtkRenderWindowInteractor.h>
  13. #include <vtkInteractorStyleTrackballCamera.h>
  14. #include <vtkDataSetMapper.h>
  15. #include <vtkCellPicker.h>
  16. #include <vtkSelectionNode.h>
  17. #include <vtkSelection.h>
  18. #include <vtkRendererCollection.h>
  19. #include <vtkExtractSelection.h>
  20. #include <vtkObjectFactory.h>
  21. /**************************************************************************/
  22. class CellPickerInteractorStyle :public vtkInteractorStyleTrackballCamera
  23. {
  24. public:
  25. static CellPickerInteractorStyle* New();
  26. CellPickerInteractorStyle()
  27. {
  28. selectedMapper = vtkSmartPointer<vtkDataSetMapper>::New();
  29. selectedActor = vtkSmartPointer<vtkActor>::New();
  30. }
  31. virtual void OnLeftButtonDown()
  32. {
  33. int* pos = this->GetInteractor()->GetEventPosition();
  34. vtkSmartPointer<vtkCellPicker> picker =
  35. vtkSmartPointer<vtkCellPicker>::New();
  36. picker->SetTolerance(0.0005);
  37. picker->Pick(pos[0], pos[1], 0, this->GetDefaultRenderer());
  38. if (picker->GetCellId() != -1)
  39. {
  40. vtkSmartPointer<vtkIdTypeArray> ids =
  41. vtkSmartPointer<vtkIdTypeArray>::New();
  42. ids->SetNumberOfComponents(1);
  43. ids->InsertNextValue(picker->GetCellId());
  44. vtkSmartPointer<vtkSelectionNode> selectionNode =
  45. vtkSmartPointer<vtkSelectionNode>::New();
  46. selectionNode->SetFieldType(vtkSelectionNode::CELL);
  47. selectionNode->SetContentType(vtkSelectionNode::INDICES);
  48. selectionNode->SetSelectionList(ids);
  49. vtkSmartPointer<vtkSelection> selection =
  50. vtkSmartPointer<vtkSelection>::New();
  51. selection->AddNode(selectionNode);
  52. vtkSmartPointer<vtkExtractSelection> extractSelection =
  53. vtkSmartPointer<vtkExtractSelection>::New();
  54. extractSelection->SetInputData(0, polyData);
  55. extractSelection->SetInputData(1, selection);
  56. extractSelection->Update();
  57. selectedMapper->SetInputData((vtkDataSet*)extractSelection->GetOutput());
  58. selectedActor->SetMapper(selectedMapper);
  59. selectedActor->GetProperty()->EdgeVisibilityOn();
  60. selectedActor->GetProperty()->SetEdgeColor(1, 0, 0);
  61. selectedActor->GetProperty()->SetLineWidth(3);
  62. this->Interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer()->AddActor(selectedActor);
  63. }
  64. vtkInteractorStyleTrackballCamera::OnLeftButtonDown();
  65. }
  66. private:
  67. vtkSmartPointer<vtkPolyData> polyData;
  68. vtkSmartPointer<vtkDataSetMapper> selectedMapper;
  69. vtkSmartPointer<vtkActor> selectedActor;
  70. };
  71. /*********************************************************************************/
  72. vtkStandardNewMacro(CellPickerInteractorStyle);
  73. int main()
  74. {
  75. vtkSmartPointer<vtkSphereSource> sphereSource =
  76. vtkSmartPointer<vtkSphereSource>::New();
  77. sphereSource->Update();
  78. vtkSmartPointer<vtkPolyDataMapper> mapper =
  79. vtkSmartPointer<vtkPolyDataMapper>::New();
  80. mapper->SetInputData(sphereSource->GetOutput());
  81. vtkSmartPointer<vtkActor> actor =
  82. vtkSmartPointer<vtkActor>::New();
  83. actor->GetProperty()->SetColor(0, 1, 0);
  84. actor->SetMapper(mapper);
  85. vtkSmartPointer<vtkRenderer> renderer =
  86. vtkSmartPointer<vtkRenderer>::New();
  87. renderer->AddActor(actor);
  88. renderer->SetBackground(1, 1, 1);
  89. vtkSmartPointer<vtkRenderWindow> rw =
  90. vtkSmartPointer<vtkRenderWindow>::New();
  91. rw->Render();
  92. rw->SetWindowName("CellPicker Interaction");
  93. rw->AddRenderer(renderer);
  94. vtkSmartPointer<vtkRenderWindowInteractor> rwi =
  95. vtkSmartPointer<vtkRenderWindowInteractor>::New();
  96. rwi->SetRenderWindow(rw);
  97. /****************************************************************************/
  98. vtkSmartPointer<CellPickerInteractorStyle> style =
  99. vtkSmartPointer<CellPickerInteractorStyle>::New();
  100. style->SetDefaultRenderer(renderer);
  101. //style->polyData = sphereSource->GetOutput();
  102. rwi->SetInteractorStyle(style);
  103. rw->Render();
  104. rwi->Initialize();
  105. rwi->Start();
  106. return 0;
  107. }

输出结果如下:

CellPickerInteractorStyle类同样派生自vtkInteraTrackballCamera,并通过重载该函数类的OnLeftButtonDown()函数来处理鼠标左键消息。PolyData为被拾取的模型数据,需要通过外部设置。在响应鼠标左键消息时,首先定义vtkCellPicker对象,使用Pick()函数实现拾取功能。拾取完毕,即可通过GetCellId()函数来得到当前拾取的单元索取号。
为了更方便地显示拾取的结果,可实现单元边的高亮显示。这里就涉及了vtkPolyData的局部数据提取功能。实现该功能时使用了几个新的类。

  • vtkIdTypeArray:对象存储当前选中的单位的索引号,每次只选取一个单元,因此每次该对象仅有一个索引号;
  • vtkSelectedNode对象与vtkSelection对象通常搭配使用,vtkSelection实际上是一个vtkSelectionNode的数组,而vtkSelectionNode则声明了要提取的数据的类型,这里SetFiledType()设置数据的类型为单元,SeiContentType()设置数据的内容为索引号。
  • vtkExtractSelection:实现了数据提取功能,其第一个输入为被提取的vtkPolyData,第二个输入为vtkSelection对象,标记要提取的数据类型。

提取完毕,即可将提取的结果保存至一个vtkActor对象,并添加至当前的vtkRenderer中显示。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/535474
推荐阅读
相关标签
  

闽ICP备14008679号