VTK(visualization toolkit)是一个开放资源的免费软件系统,主要用于三维计算机图形学、图像处理和可视化。
在VTK中有2种不同风格的文件格式可用,最简单的是传统的、串行的格式,这种格式无论手工还是编程都容易读写,然而这种格式没有基于XML文件格式灵活;XML格式支持随机访问、并行IO,以及跨平台数据压缩。本文只介绍最常见的传统VTK文件格式。
传统VTK文件格式包括5个基本部分:
1. 第一部分是文件版本号及标识。该部分包含单行:#vtk DataFile Version x.x
2. 第二部分是头部。头部包含以换行符\n终止的字符串。头部最多可有256个字符,头部用于描述数据并且包含其他相关信息。
3. 紧接着的一部分是文件格式。文件格式描述文件的类型,ASCII或二进制。该行必须以ASCII或BINARY出现。
4. 第四部分是数据集结构。几何部分描述了数据集的几何和拓扑结构。该行以关键字DATASET开始,后面紧跟着一个表示数据集类型的关键字。
5. 最后一部分描述数据集的属性。这部分以关键字POINT_DATA或者CELL_DATA开始,后面跟着一整数值,该值指定了点或单元的个数。POINT_DATA和CELL_DATA出现的顺序无关紧要。然后其他的关键字/数据组合定义了真实的数据集属性值。
VTK传统文件格式如下图所示:
其中前面3个是必须的,后面2个是可选的。
这里主要介绍下Polygonal Data。
多边形数据集包含曲面图形图元顶点、直线、多边形以及三角条的任意组合。多边形数据是由POINTS, VERTICES, LINES, POLYGONS, 或TRIANGLE_STRIPS关键字定义的。POINTS部分定义了点的坐标;VERTICES,LINES,POLYGONS或TRIANGLE_STRIPS关键字定义了多边形数据集的拓扑结构。每个关键字需要2个参数:参数n表示单元的个数,参数size表示单元列表的大小;单元列表的大小是显示列表所要求的整数值的总数。以上关键字没有一个是必须的。VTK支持以下数据集属性:标量,向量,法线,纹理坐标(1D,2D,3D),3*3张量,以及场数据。另外,还定义了一个查找表,该表与标量数据相关,用RGBA颜色指定。数据集属性由点和单元支持。
每个属性数据的类型有一个dataName与之关联,它是一个字符串,用于标识一个特定的数据。VTK读者用dataName来提取数据,因此相同类型至少有一个属性数据能包含在文件中。例如,在数据集点上定义了2个不同标量场压强和温度,它们可以包含在相同的文件中。
这里介绍下查找表:
tableName字段是一个字符串,用于标识查找表。该标签被VTK读者用于提取特殊的表。
查找表中每一项是一个rgba[4]的数组,每一项为red-green-blue-alpha, alpha是不透明度,当alpha=0时表示透明。如果文件格式是ASCII,那么查找表的值必须是介于(0, 1)间的float类型的值。
以下为cube.vtk文件,其内容为:
# vtk DataFile Version 3.0
Cube example
ASCII
DATASET POLYDATA
POINTS 8 float #批注:立方体的8个顶点,位于第一卦限
0.0 0.0 0.0
1.0 0.0 0.0
1.0 1.0 0.0
0.0 1.0 0.0
0.0 0.0 1.0
1.0 0.0 1.0
1.0 1.0 1.0
0.0 1.0 1.0
POLYGONS 6 30 #批注:多边形,立方体的6个平面,30 = 6*5,5表示每行5个值;4表示每个多边形是四边形,后面紧跟着的4个数值则为顶点的序号
4 0 1 2 3
4 4 5 6 7
4 0 1 5 4
4 2 3 7 6
4 0 4 7 3
4 1 2 6 5
CELL_DATA 6 #批注:单元数据的值,此处为6个平面对应的标量值,例如压强
SCALARS cell_scalars int 1
LOOKUP_TABLE default
0
1
2
3
4
5
NORMALS cell_normals float #批注:6个平面对应的法向量
0 0 -1
0 0 1
0 -1 0
0 1 0
-1 0 0
1 0 0
FIELD FieldData 2
cellIds 1 6 int
0 1 2 3 4 5
faceAttributes 2 6 float
0.0 1.0 1.0 2.0 2.0 3.0 3.0 4.0 4.0 5.0 5.0 6.0
POINT_DATA 8 #批注:各点对应的数据,此处为8个顶点标量数据,例如温度
SCALARS sample_scalars float 1
LOOKUP_TABLE my_table
0.0
1.0
2.0
3.0
4.0
5.0
6.0
7.0
LOOKUP_TABLE my_table 8
0.0 0.0 0.0 1.0 #批注:前面的0.0 0.0 0.0表示RGB值,后面的1.0表示不透明度,如果为0则为透明
1.0 0.0 0.0 1.0
0.0 1.0 0.0 1.0
1.0 1.0 0.0 1.0
0.0 0.0 1.0 1.0
1.0 0.0 1.0 1.0
0.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
直接在ParaView中打开该文件观察:图中颜色的分布情况现在还不能找到相应的解释。
VTK由C++类库和几个解释接口层(包括Python、Tcl/Tk以及Java)组成,VTK支持多种可视化算法,包括标量、向量、张量、纹理以及体积法,以及高级模型技术,例如隐式模型、多边形简化、网格平滑、剪切、轮廓线以及Delaunay三角化。另外,为了允许用户混合2D图像/3D图形算法和数据,已经直接将几十个图像算法集成了。
VTK是由两种模型组成,分别为图形模型Graphics Model和可视化模型Visualization Model。
图形模型主要对生成的几何体进行绘制,下面是一些常用的核心对象:
vtkActor, vtkActor2D, vtkVolume--vtkProp和/或vtkProp3D的子类
vtkLight--灯光
vtkCamera--镜头,照相机
vtkProperty, vtkProperty2D--
vtkMapper, vtkMapper2D--vtkAbstractMapper的子类
vtkTransform--
vtkLookupTable, vtkColorTransferFunction--vtkScalarsToColors的子类
vtkRender
vtkRenderWindow
vtkRenderWindowInteractor
可以通过对上述对象的组合形成场景Scene。
可视化模型主要对数据进行处理,生成可被绘制的几何体,可视化模型主要包含两类对象:数据对象和过程对象。
(1)数据对象
(a)多边形数据(vtkPloyData):表示由顶点、直线、多边形即三角面片组成的几何体, 支持多种的原子类型, 如vtkVertex,vtk-PloyVertex, vtkLine等。
(b)结构点数据(vtkStructurePoint):是一包括表面形状及几何形状的几何体。
(c)非结构点数据(vtkUnStructurePoint):指定了几何体的外观;结构网格( vtkStructureGrid):指定了几何体的结构。
(d)非结构网格(vtkUnStructureGrid):可以为任意的cell 类型的组合。
(e)数据对象继承关系。
(2)过程对象
VTK中定义的过程对象根据其pipeline主要包括了数据源(Source),过滤器(Filters),映射(Mappers),数据流水线(data pipeline),过程如图所示
用VTK创建一个图形可视化应用程序是相当简单的,它包含2个基本步骤,首先创建一个数据管道线来处理数据,然后创建必需的图形对象来显示数据即可。
构造一个管道线是为了连接源数据(加载或创建数据)、过滤器(处理数据)以及映射器(通过查找表映射)。
为了创建图形对象,典型的步骤如下:
1. 创建一个绘制窗口
2. 创建一个绘制器
3. 创建一个交互器(用户可以与图形进行交互)
4. 创建一个或多个演员(每个都被链接到映射器)
5. 绘制
下面编写在PCL中调用VTK库处理cube.vtk文件,代码如下void visual_vtk(const char *szVTKFile) { vtkSmartPointer<vtkPolyDataReader> reader = vtkSmartPointer<vtkPolyDataReader>::New (); reader->SetFileName (szVTKFile); reader->Update (); vtkSmartPointer<vtkPolyData> polydata = reader->GetOutput (); // map the contours to graphical primitives vtkPolyDataMapper *contMapper = vtkPolyDataMapper::New(); contMapper->SetInput(polydata); // create an actor for the contours vtkActor *contActor = vtkActor::New(); contActor->SetMapper(contMapper); // a renderer and render window vtkRenderer *ren1 = vtkRenderer::New(); vtkRenderWindow *renWin = vtkRenderWindow::New(); renWin->AddRenderer(ren1); // an interactor vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New(); iren->SetRenderWindow(renWin); // add the actors to the scene ren1->AddActor(contActor); ren1->SetBackground(1,1,1); // Background color white // render an image (lights and cameras are created automatically) renWin->Render(); // begin mouse interaction iren->Start(); }
运行后,显示的图像为:
文章参考于:
http://www.vtk.org/VTK/help/examplecode.html
http://www.vtk.org/VTK/img/file-formats.pdf
原文:http://blog.csdn.net/lming_08/article/details/20357163