1 #include <vtkAutoInit.h>
2 VTK_MODULE_INIT(vtkRenderingOpenGL)
3 VTK_MODULE_INIT(vtkRenderingFreeType)
4 VTK_MODULE_INIT(vtkInteractionStyle)
5
6 #include <vtkSmartPointer.h>
7 #include <vtkSphereSource.h>
8 #include <vtkPolyDataMapper.h>
9 #include <vtkActor.h>
10 #include <vtkRenderer.h>
11 #include <vtkRenderWindow.h>
12 #include <vtkRenderWindowInteractor.h>
13
14 #include <vtkPointPicker.h>
15 //this->Interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer()
16 #include <vtkRendererCollection.h>
17 #include <vtkInteractorStyleTrackballCamera.h>
18 #include <vtkObjectFactory.h> //vtkStandardNewMacro();
19 #include <vtkProperty.h>
20
21 #include <vtkAxesActor.h>
22 #include <vtkOrientationMarkerWidget.h>
23 /**************************************************************************************************/
24 class PointPickerInteractorStyle : public vtkInteractorStyleTrackballCamera
25 {
26 public:
27 static PointPickerInteractorStyle* New();
28 vtkTypeMacro(PointPickerInteractorStyle, vtkInteractorStyleTrackballCamera);
29
30 virtual void OnLeftButtonDown()
31 {
32 //打印鼠标左键像素位置
33 std::cout << "Picking pixel: " << this->Interactor->GetEventPosition()[0]
34 << " " << this->Interactor->GetEventPosition()[1] << std::endl;
35 //注册拾取点函数
36 this->Interactor->GetPicker()->Pick(
37 this->Interactor->GetEventPosition()[0],
38 this->Interactor->GetEventPosition()[1], 0, // always zero.
39 this->Interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer()
40 );
41 //打印拾取点空间位置
42 double picked[3];
43 this->Interactor->GetPicker()->GetPickPosition(picked);
44 std::cout << "Picked value: " << picked[0] << " " << picked[1] << " " << picked[2] << std::endl;
45 //对拾取点进行标记
46 vtkSmartPointer<vtkSphereSource> sphereSource =
47 vtkSmartPointer<vtkSphereSource>::New();
48 sphereSource->Update();
49
50 vtkSmartPointer<vtkPolyDataMapper> mapper =
51 vtkSmartPointer<vtkPolyDataMapper>::New();
52 mapper->SetInputConnection(sphereSource->GetOutputPort());
53
54 vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
55 actor->SetMapper(mapper);
56 actor->SetPosition(picked);
57 actor->SetScale(0.05);
58 actor->GetProperty()->SetColor(1.0, 0.0, 0.0);
59 this->Interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer()->AddActor(actor);
60
61 vtkInteractorStyleTrackballCamera::OnLeftButtonDown();
62 }
63 };
64 /**************************************************************************************************/
65
66 vtkStandardNewMacro(PointPickerInteractorStyle);
67
68 int main()
69 {
70 vtkSmartPointer<vtkSphereSource> sphereSource =
71 vtkSmartPointer<vtkSphereSource>::New();
72 sphereSource->Update();
73
74 vtkSmartPointer<vtkPolyDataMapper> mapper =
75 vtkSmartPointer<vtkPolyDataMapper>::New();
76 mapper->SetInputConnection(sphereSource->GetOutputPort());
77 vtkSmartPointer<vtkActor> actor =
78 vtkSmartPointer<vtkActor>::New();
79 actor->SetMapper(mapper);
80
81 vtkSmartPointer<vtkRenderer> renderer =
82 vtkSmartPointer<vtkRenderer>::New();
83 renderer->AddActor(actor);
84 renderer->SetBackground(1, 1, 1);
85
86 vtkSmartPointer<vtkRenderWindow> renderWindow =
87 vtkSmartPointer<vtkRenderWindow>::New();
88 renderWindow->Render();
89 renderWindow->SetWindowName("PointPicker");
90 renderWindow->AddRenderer(renderer);
91
92 vtkSmartPointer<vtkPointPicker> pointPicker =
93 vtkSmartPointer<vtkPointPicker>::New();
94
95 vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
96 vtkSmartPointer<vtkRenderWindowInteractor>::New();
97 renderWindowInteractor->SetPicker(pointPicker);
98 renderWindowInteractor->SetRenderWindow(renderWindow);
99
100 vtkSmartPointer<PointPickerInteractorStyle> style =
101 vtkSmartPointer<PointPickerInteractorStyle>::New();
102 renderWindowInteractor->SetInteractorStyle(style);
103 /
104 vtkSmartPointer<vtkAxesActor> Axes = vtkSmartPointer<vtkAxesActor>::New();
105 vtkSmartPointer<vtkOrientationMarkerWidget> widget =
106 vtkSmartPointer<vtkOrientationMarkerWidget>::New();
107 widget->SetInteractor(renderWindowInteractor);
108 widget->SetOrientationMarker(Axes);
109 widget->SetOutlineColor(1, 1, 1);
110 widget->SetViewport(0, 0, 0.2, 0.2);
111 widget->SetEnabled(1);
112 widget->InteractiveOn();
113
114 renderWindow->Render();
115 renderWindowInteractor->Start();
116
117 return 0;
118 }
- GetPackPosition()是指世界坐标系下拾取点的坐标
- mian()函数中设计拾取调用流程
1 vtkSmartPointer<vtkPointPicker> pointPicker =
2 vtkSmartPointer<vtkPointPicker>::New();
3
4 vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
5 vtkSmartPointer<vtkRenderWindowInteractor>::New();
6 renderWindowInteractor->SetPicker(pointPicker);
7 renderWindowInteractor->SetRenderWindow(renderWindow);
8
9 vtkSmartPointer<PointPickerInteractorStyle> style =
10 vtkSmartPointer<PointPickerInteractorStyle>::New();
11 renderWindowInteractor->SetInteractorStyle(style);
实例化vtkPointPicker对象以后,调用vtkRenderWindowInteractor::SetPicker()函数将其设置到渲染窗口交互器中。PointPickerInteractorStyle类与vtkInteractorStyleImage等交互器样式使用方法一致。