vtk世界坐标拾取器
1 /** 2 * @file main.cpp 3 * @brief vtk世界坐标拾取器 4 * @author 禅元天道(chanyuantiandao@126.com) 5 * @version 1.0.0 6 * @date 2022-07-19 7 */ 8 #include <vtkActor.h> 9 #include <vtkInteractorStyleTrackballCamera.h> 10 #include <vtkNamedColors.h> 11 #include <vtkNew.h> 12 #include <vtkObjectFactory.h> 13 #include <vtkPolyDataMapper.h> 14 #include <vtkProperty.h> 15 #include <vtkRenderWindow.h> 16 #include <vtkRenderWindowInteractor.h> 17 #include <vtkRenderer.h> 18 #include <vtkRendererCollection.h> 19 #include <vtkSphereSource.h> 20 #include <vtkWorldPointPicker.h> 21 22 #include "vtkAutoInit.h" 23 VTK_MODULE_INIT(vtkRenderingOpenGL2); 24 VTK_MODULE_INIT(vtkInteractionStyle); 25 VTK_MODULE_INIT(vtkRenderingFreeType) 26 27 namespace { 28 29 // Define interaction style 30 class MouseInteractorStyle : public vtkInteractorStyleTrackballCamera 31 { 32 public: 33 static MouseInteractorStyle* New(); 34 vtkTypeMacro(MouseInteractorStyle, vtkInteractorStyleTrackballCamera); 35 36 virtual void OnLeftButtonDown() override 37 { 38 // 鼠标点击点 39 std::cout << "Picking pixel: " << this->Interactor->GetEventPosition()[0] 40 << " " << this->Interactor->GetEventPosition()[1] << std::endl; 41 42 this->Interactor->GetPicker()->Pick(this->Interactor->GetEventPosition()[0], 43 this->Interactor->GetEventPosition()[1], 0, // 二维世界,z为0 44 this->Interactor->GetRenderWindow() 45 ->GetRenderers() 46 ->GetFirstRenderer()); 47 48 // 获取世界坐标值 49 double picked[3]; 50 this->Interactor->GetPicker()->GetPickPosition(picked); 51 52 std::cout << "Picked value: " << picked[0] << " " << picked[1] << " " 53 << picked[2] << std::endl; 54 55 // 事件转发 56 vtkInteractorStyleTrackballCamera::OnLeftButtonDown(); 57 } 58 }; 59 vtkStandardNewMacro(MouseInteractorStyle); 60 61 } // namespace 62 63 64 int main() 65 { 66 vtkNew<vtkNamedColors> colors; 67 68 vtkNew<vtkSphereSource> sphereSource; 69 sphereSource->Update(); 70 71 vtkNew<vtkPolyDataMapper> mapper; 72 mapper->SetInputConnection(sphereSource->GetOutputPort()); 73 vtkNew<vtkActor> actor; 74 actor->SetMapper(mapper); 75 actor->GetProperty()->SetColor(colors->GetColor3d("MistyRose").GetData()); 76 77 vtkNew<vtkRenderer> renderer; 78 vtkNew<vtkRenderWindow> renderWindow; 79 renderWindow->AddRenderer(renderer); 80 renderWindow->SetWindowName("WorldPointPicker"); 81 82 // ①世界坐标拾取器 83 vtkNew<vtkWorldPointPicker> worldPointPicker; 84 vtkNew<vtkRenderWindowInteractor> renderWindowInteractor; 85 // ②设置拾取器 86 renderWindowInteractor->SetPicker(worldPointPicker); 87 renderWindowInteractor->SetRenderWindow(renderWindow); 88 89 // ③设置交互样式,处理事件 90 vtkNew<MouseInteractorStyle> style; 91 renderWindowInteractor->SetInteractorStyle(style); 92 93 renderer->AddActor(actor); 94 renderer->SetBackground(colors->GetColor3d("SlateGray").GetData()); 95 96 renderWindow->Render(); 97 renderWindowInteractor->Start(); 98 99 return EXIT_SUCCESS; 100 }