VTK 实例8:command与observe设计模式(当交互使相机变化时打印出当前相机的坐标,当发生拾取演员事件时,演员设置为红色)

发布时间 2023-08-14 15:10:52作者: 一杯清酒邀明月
 1 #include "vtkAutoInit.h" 
 2 VTK_MODULE_INIT(vtkRenderingOpenGL2);
 3 VTK_MODULE_INIT(vtkInteractionStyle);
 4 #include <vtkConeSource.h>
 5 #include <vtkPolyDataMapper.h>
 6 #include <vtkRenderer.h>
 7 #include <vtkRenderWindow.h>
 8 #include <vtkActor.h>
 9 #include <vtkCamera.h>
10 #include <vtkRenderWindowInteractor.h>
11 #include <vtkCommand.h>
12 #include <vtkProperty.h>
13 //自定义类vtkMyCallback,输出当前相机坐标(x,y,z)
14 class vtkMyCallback : public vtkCommand
15 {
16 public://公共成员
17     static vtkMyCallback *New() //静态重载New函数,提醒返回用New创建的类vtkMyCallback
18     { return new vtkMyCallback; }
19     //重载command虚拟函数Execute
20     virtual void Execute(vtkObject *caller, unsigned long, void*)
21     {
22         //将caller转型为renderer对象
23         vtkRenderer *renderer = reinterpret_cast<vtkRenderer*>(caller);
24         //输出相机位置(x,y,z)
25         cout << renderer->GetActiveCamera()->GetPosition()[0] << " "
26             << renderer->GetActiveCamera()->GetPosition()[1] << " "
27             << renderer->GetActiveCamera()->GetPosition()[2] << "\n";
28     }
29 };
30 //自定义类vtkMyCallback2,设置演员的颜色为红色
31 class vtkMyCallback2 : public vtkCommand
32 {
33 public:
34     static vtkMyCallback2 *New()
35     {
36         return new vtkMyCallback2;
37     }
38     //重载command虚拟函数Execute
39     virtual void Execute(vtkObject *caller, unsigned long eventId, void *callData)
40     {
41         //将caller转型为actor对象
42         vtkActor *actor = reinterpret_cast<vtkActor*>(caller);
43         //设置演员的颜色为红色
44         actor->GetProperty()->SetColor(1.0,0.0,0.0);
45     }
46 };
47 
48 int main()
49 {
50     //实例化一个椎体对象cone
51     vtkConeSource *cone=vtkConeSource::New();
52     cone->SetResolution (10);
53     cone->SetHeight(3);
54     cone->SetRadius(1);
55 
56     vtkPolyDataMapper *coneMapper=vtkPolyDataMapper::New();
57     coneMapper->SetInputConnection(cone->GetOutputPort());
58 
59     vtkActor *coneActor=vtkActor::New();
60     coneActor->SetMapper(coneMapper);
61 
62     //实例化回调函数mycallback2
63     vtkMyCallback2 *mycallback2 = vtkMyCallback2::New();
64     //监听器Observer如果发现有拾取事件PickEvent发生,则调用mycallback2对象
65     coneActor->AddObserver(vtkCommand::PickEvent,mycallback2);
66     mycallback2->Delete();
67 
68     vtkRenderer *renderer=vtkRenderer::New();
69     renderer->AddActor(coneActor);
70     renderer->SetBackground(0.1,0.2,0.4);
71 
72     //实例化回调函数mycallback
73     vtkMyCallback *mo1 = vtkMyCallback::New();
74     //监听器Observer如果发现renderer有交互开始事件StartEvent发生,则调用mol对象
75     renderer->AddObserver(vtkCommand::StartEvent,mo1);
76     mo1->Delete(); 
77 
78     vtkRenderWindow *renWin=vtkRenderWindow::New();
79     renWin->SetSize(400,400);
80     renWin->AddRenderer(renderer);
81 
82     vtkRenderWindowInteractor *interactor = vtkRenderWindowInteractor::New();
83     interactor->SetRenderWindow(renWin);
84     renWin->Render();
85     interactor->Initialize();
86     interactor->Start();
87    
88     cone->Delete();
89     coneActor->Delete();
90     coneMapper->Delete();
91     renderer->Delete();
92     renWin->Delete();
93     interactor->Delete();
94 
95     return 0;
96 }

 按下p键进行拾取