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 }

 

posted @ 2021-05-10 15:25  QAQ_BIU  阅读(398)  评论(0)    收藏  举报