最近学了一下vtk文件的格式, 做一个小结。文中用方括号标示出来的文字是根据实际需要自己定义的部分,其他的如DATASET, POINTS,CELLS等是vtk本身的格式要求一部分。
文章目录
- 1. 第一部分,数据版本声明(不重要)
- 2. 第二部分,标题 (不重要)
- 3. 第三部分,文件格式声明
- 4.第四部分,几何拓扑结构(重要)
- 5. 第五部分,物理量(重要)
- 6. 单元类型与节点顺序
- 7. 牛刀小试
- 学习资源
1. 第一部分,数据版本声明(不重要)
这是强制的一句话,说明文件版本
# vtk DataFile Version 3.0
2. 第二部分,标题 (不重要)
不重要,相当于自己其一个标题,以回车结束,最多256个字符
3. 第三部分,文件格式声明
文件格式,ASCII
或者 BINARY
于是前面三部分可以写为
# vtk DataFile Version 3.0
[VTKtitle]
ASCII
4.第四部分,几何拓扑结构(重要)
DATASET [format]
format
表示数据的格式,可以是
- STRUCTURED_POINTS
- STRUCTURED_GRID
- UNSTRUCTURED_GRID
- POLYDATA
- RECTILINEAR_GRID
- FIELD
例如,如果是非结构网格的话,就写DATASET UNSTRUCTURED_GRID
。这里的非结构网格不一定是四面体或三角形网格,只要是没有规则的都能用UNSTRUCTURED GRID表示,比如一个三角形和一个六面体的混合。
如果是UNSTRUCTURED_GRID
, 那么接下来就需要指定节点和单元
POINTS [n] [dataType] (#n_point#域填入实际的点数, dataType为double float等类型)
[x_0] [y_0] [z_0]
[x_1] [y_1] [z_1]
[x_0] [y_0] [z_0]
然后是单元声明
CELLS [n_cells] [n_list] #n_cells填入单元个数,n_list填入下方列表包含的数字的个数,即“单元数*(1+每个单元节点数)”)
[单元0上的顶点总数目] [单元0顶点0的编号] [单元0顶点1的编号] [单元0顶点2的编号] ...
[单元1上的顶点总数目] [单元1顶点0的编号] [单元1顶点1的编号] [单元1顶点2的编号] ...
.
.
.CELL_TYPES [n_cells] #n_cells与前面CELLS那一块的n_cells必须一样
[单元0类型] #表示几何类型的整数,参考vtk的文档,比如四面体是10,六面体是11
[单元1类型]
.
.
.
5. 第五部分,物理量(重要)
有两种:节点上的值和单元上的值,分别用POINT_DATA
和 CELL_DATA
表示。可以表示多个物理量,物理量可以是标量(scalar),向量(vector),或者是张量(tensor)。
POINT_DATA [n]
[数据]CELL_DATA [n]
[数据]
上述格式中,数据可以是SCALAR,VECTOR或TENSOR,不同类型的数据需要不同的格式
SCALARS [dataName] [dataType] [numComp] #dataName数据名字,dataType是double之类的,numComp一般是1
LOOKUP_TABLE [tableName] #tableName表名
s_0
s_1
...
s_n-1
6. 单元类型与节点顺序
各个单元种类以及对应编号,括号中的数字为单元类型标识
7. 牛刀小试
(1)一个最简单的示例
下面的vtk文件定义了一个六面体,顶点为(0,0,0), (50,0,0), (0,50,0), (50,50,0), (0,0,50), (50,0,50), (0,50,50), (50,50,50).
注意:构成一个单元的节点的排列顺序一定要按照vtk文档所定义的,不同几何体节点编号也不一样
# vtk DataFile Version 3.0
Right rectangular prisms grid
ASCII
DATASET UNSTRUCTURED_GRIDPOINTS 8 double
0 0 0
50 0 0
0 50 0
50 50 0
0 0 50
50 0 50
0 50 50
50 50 50CELLS 1 9
8 0 1 2 3 4 5 6 7 CELL_TYPES 1
11CELL_DATA 1
SCALARS density double 1
LOOKUP_TABLE table1
1SCALARS resistivity double 1
LOOKUP_TABLE table2
2SCALARS temperature double 1
LOOKUP_TABLE table3
3SCALARS susceptibility double 1
LOOKUP_TABLE table4
4SCALARS permittivity double 1
LOOKUP_TABLE table4
4
(2) 一个六面体网格示例
一个六面体网格的模型, 用paraview显示
学习资源
- python和vtk的一个入门讲义:http://www.cb.uu.se/~aht/Vis2014/lecture2.pdf
- vtk官网: https://www.vtk.org/
- 各种语言接口的VTK例子,VTKExamples: https://lorensen.github.io/VTKExamples/site/