VTK原理
VTk通过数据流实现变信息为图形数据的。
数据流一般为:source—filter——mapper——actor——render——renderwindow——interactor。
首先应明确几个类型:
1.vtkSource(数据源) 这个就好比一个剧本里面的角色,让演员知道要演的是什么人物。
数据源有:vtkConeSource,vtkSphereSource,vtkOutlineSource...等等。
它们都继承与vtkPolyDataAlgorithm类,该类用于提供不同的类型的数据源
2.vtkMapper(映射器) 它就像是一个剧本,应该如何塑造角色的装扮
映射器有:vtkDataSetMapper,vtkMultiGroupPolyDataMapper,vtkPolyDataMapper。
它们都继承于vtkMapper类。所有的数据对象都要通过映射器Mapper映射到vtkActor中。
3.vtkActor(演员) 有了剧本,有了角色,得找个真人来演出这个剧本了。
该类继承于vtkProp3D,有4个子类:vtkFollow,vtkLODActor,vtkMesaActor,vtkOpenGLActor.
4.vtkRenderer(渲染器) 这个过程就相当于对演员进行化妆并布置场景;
该类继承于vtkViewport,有2个子类:vtkMesaRender,vtkOpenGLRender.
该类另外一个作用是设置窗口vtkRenderWindow的背景并处理演员.
5.vtkRenderWindow(窗口) 这个就相当于个舞台 ,把准备好的演员放进去,将渲染的所有内容置于窗口vtkRenderWindow中,准备表演了;
该类继承于vtkWindow,有2个子类:vtkMesaWindow,vtkOpenGLWindow.
6.vtkRenderWindowInteractor(窗口交互器) 这个像摄像机,用于捕捉演员的动作,然后传给导演看
该类的继承关系在vtkRenderWindowInteractor文章中已给出。
7.vtkInteractorObserver(观察者) 有点导演的意思,导演通过观看录像后,做出一系列调整
该类的继承关系在vtkRenderWindowInteractor文章中已给出
下面是一个显示点云数据“points.asc”的VTK程序,更形象地说明VTK的工作原理:
1 #include "vtkActor.h" 2 #include "vtkFloatArray.h" 3 #include "vtkPointData.h" 4 #include "vtkPoints.h" 5 #include "vtkRenderWindow.h" 6 #include "vtkDataSetMapper.h" 7 #include "vtkRenderWindowInteractor.h" 8 #include "vtkRenderer.h" 9 #include "vtkProperty.h" 10 #include "vtkSimplePointsReader.h" 11 #include <iostream> 12 13 int main() 14 { 15 /*获取剧本,即通过映射器vtkMapper获取欲显示的数据*/ 16 vtkDataSetMapper *map = vtkDataSetMapper::New(); 17 vtkSimplePointsReader *PointsReader = 18 vtkSimplePointsReader::New(); 19 PointsReader->SetFileName ("points.asc"); 20 map->SetInputConnection(PointsReader->GetOutputPort()); 21 22 /*将剧本拿给演员,即将映射器中的数据赋给演员vtkActor*/ 23 vtkActor *actor = vtkActor::New(); 24 actor->SetMapper(map); 25 actor->GetProperty()->SetPointSize(5); 26 actor->GetProperty()->SetColor(0,0,0); 27 28 /*对演员进行化妆并布置场景,即通过渲染器vtkRenderer设置背景并处理演员*/ 29 vtkRenderer *ren = vtkRenderer::New(); 30 ren->SetBackground(1, 1, 1); 31 ren->AddActor(actor); 32 33 /*开拍,即将渲染的所有内容置于窗口vtkRenderWindow中*/ 34 vtkRenderWindow *win = vtkRenderWindow::New(); 35 win->AddRenderer(ren); 36 win->SetSize(400,400); 37 38 /*放映,即通过窗口交互vtkRenderWindowInteractor显示欲显示的内容*/ 39 vtkRenderWindowInteractor *iren = 40 vtkRenderWindowInteractor::New(); 41 iren->SetRenderWindow(win); 42 iren->Initialize(); 43 iren->Start(); 44 45 /*收工,即释放内存*/ 46 actor->Delete(); 47 ren->Delete(); 48 win->Delete(); 49 iren->Delete(); 50 51 return 0; 52 }