VTK学习记录2-交互机制
交互机制类就是vtkRenderWindowInteractor,可以使用这个类实现观众和actor的交互,比如让actor移动或者旋转等等。
机制说明:
vtkRenderWindowInteractor会截取与之相关的vtkRenderWindow上的事件(这里是通过vtkRenderWindowInteractor里的SetRenderWindow()方法关联的)。
当vtkRenderWindowInteractor::Start()会激活事件截取功能。
所有截取的事件会被vtkRenderWindowInteractor::InterStyle这个实例处理,它的类型是vtkInteractorObserver。
而vtkInteractorObserver作用就是用来检测发生的时间,这样截取的消息就可以处理了。
代码:
1 //tips:如果不是用cmake编译,而是用vs编译的,需要加这三行。 2 #include "vtkAutoInit.h" 3 VTK_MODULE_INIT(vtkRenderingOpenGL2); // VTK was built with vtkRenderingOpenGL2 4 VTK_MODULE_INIT(vtkInteractionStyle); 5 6 #include <vtkConeSource.h> 7 #include <vtkRenderer.h> 8 #include <vtkPolyDataMapper.h> 9 #include <vtkRenderWindow.h> 10 #include <vtkActor.h> 11 #include <vtkCamera.h> 12 #include <vtkRenderWindowInteractor.h> 13 #include <vtkInteractorStyleTrackballCamera.h> 14 #include <vtkInteractorStyleTrackballActor.h> 15 16 int main() 17 { 18 vtkConeSource *cone = vtkConeSource::New(); 19 cone->SetResolution(8); 20 cone->SetHeight(5); 21 cone->SetRadius(6); 22 23 vtkPolyDataMapper *coneMapper = vtkPolyDataMapper::New(); 24 coneMapper->SetInputData(cone->GetOutput()); 25 coneMapper->SetInputConnection(cone->GetOutputPort()); 26 27 vtkActor *vtkactor = vtkActor::New(); 28 vtkactor->SetMapper(coneMapper); 29 30 vtkRenderer *render = vtkRenderer::New(); 31 render->AddActor(vtkactor); 32 render->SetBackground(0.1, 0.2, 0.3); 33 34 vtkRenderWindow *window = vtkRenderWindow::New(); 35 window->SetSize(500, 500); 36 window->AddRenderer(render); 37 38 vtkRenderWindowInteractor *interactor = vtkRenderWindowInteractor::New(); 39 interactor->SetRenderWindow(window);//关联要交互的窗口 40 41 //现在设置控制的是相机,也可以实现相同的效果。 42 vtkInteractorStyleTrackballCamera *style = vtkInteractorStyleTrackballCamera::New(); 43 interactor->SetInteractorStyle(style); 44 45 //用这个就是设置控制演员 46 /*vtkInteractorStyleTrackballActor *style2 = vtkInteractorStyleTrackballActor::New(); 47 interactor->SetInteractorStyle(style2);*/ 48 49 //旋转代码 50 /*for (int i = 0; i < 1800; i++) 51 { 52 window->Render(); 53 render->GetActiveCamera()->Azimuth(1); 54 }*/ 55 56 interactor->Initialize(); 57 interactor->Start(); 58 59 60 cone->Delete(); 61 coneMapper->Delete(); 62 vtkactor->Delete(); 63 render->Delete(); 64 window->Delete(); 65 interactor->Delete(); 66 style->Delete(); 67 return 0; 68 }
注释:关于交互方式有很多种,可以换成下面这两行代码(记得加上对应的头文件)。那么鼠标滑动动的就是acctor了。具体还有别的交互方式可以自己去摸索。
1 //设置控制演员 2 vtkInteractorStyleTrackballActor *style2 = vtkInteractorStyleTrackballActor::New(); 3 interactor->SetInteractorStyle(style2);
效果图:
注释:点击actor,然后按键盘上的“P”按键,周围会出现一圈红色的包围盒。
这里设置控制相机后,点击空白处就不会旋转了。注销掉那两行后,点击空白处actor会旋转。