VTK调研

VTK(visualization toolkit)是一个开放资源的免费软件系统,主要用于三维计算机图形学、图像处理和可视化。

VTK文件格式

在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个是可选的。

数据集种类:

VTK支持5种不同的数据集格式:结构化点(Structured Points),结构化网格(Structured Grid),矩阵线性网格(Rectilinear Grid),非结构化网格(Unstructured Grid),多边形数据(Polygonal Data)。

这里主要介绍下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库简介

VTK由C++类库和几个解释接口层(包括Python、Tcl/Tk以及Java)组成,VTK支持多种可视化算法,包括标量、向量、张量、纹理以及体积法,以及高级模型技术,例如隐式模型、多边形简化、网格平滑、剪切、轮廓线以及Delaunay三角化。另外,为了允许用户混合2D图像/3D图形算法和数据,已经直接将几十个图像算法集成了。

VTK是由两种模型组成,分别为图形模型Graphics Model和可视化模型Visualization Model。

Graphics Model

图形模型主要对生成的几何体进行绘制,下面是一些常用的核心对象:

vtkActor, vtkActor2D, vtkVolume--vtkProp和/或vtkProp3D的子类

vtkLight--灯光

vtkCamera--镜头,照相机

vtkProperty, vtkProperty2D--

vtkMapper, vtkMapper2D--vtkAbstractMapper的子类

vtkTransform--

vtkLookupTable, vtkColorTransferFunction--vtkScalarsToColors的子类

vtkRender

vtkRenderWindow

vtkRenderWindowInteractor

可以通过对上述对象的组合形成场景Scene。

Visualization Model

可视化模型主要对数据进行处理,生成可被绘制的几何体,可视化模型主要包含两类对象:数据对象和过程对象。

(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编程

用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



  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值