本文翻译自vtk官方文档:vtk_file_format
文末有链接
VTK提供了许多源对象和编写器对象,用于读取和写入流行的数据文件格式,此外,VTK也提供了自己的文件格式。创建一种数据文件格式的主要原因是为各种数据集类型提供一致的数据表示方案,并提供一种在软件之间通信数据的简单方法。只要有可能,我们建议您使用更广泛的格式,但如果这不可能,则可以改用本文介绍的格式。请注意,这些格式可能不会得到许多其他工具的支持。
VTK中有两种不同样式的文件格式。 最简单的是传统的串行格式,可以通过手工或程序轻松读取和写入,但是,这些格式的灵活性不如本节稍后介绍的基于XML的文件格式。 XML格式支持随机访问,并行I / O和可移植数据压缩,在可能的情况下,优先考虑此格式。
传统VTK文件格式包含五个基本部分:
1. 第一部分是文件版本和标识符。 这部分包含单行# vtk DataFile Version x.x
,该行必须与显示的完全相同,但版本号x.x除外,该版本号会因VTK的不同发行版而变化。(注意:当前版本是3.0。版本1.0和2.0文件与版本3.0是兼容的)
2. 第二部分是标题。标题由以行尾字符n终止的字符串组成。最大为256个字符,可用于描述数据并包括任何其他相关信息。
3. 下一部分是文件格式。文件格式描述文件的类型,可以是ASCII或二进制。 在此行上,必须出现单个单词ASCII
或BINARY
。
4. 第四部分是数据集结构。几何部分描述了数据集的几何和拓扑。这部分以包含关键字DATASET
的行开头,后跟描述数据集类型的关键字。然后,根据数据集的类型,其他关键字/数据组合将定义实际数据。
5. 最后一部分描述了数据集属性。 这部分以关键字POINT_DATA
或CELL_DATA
开头,后跟一个整数,分别指定点或单元的数量。(先出现POINT_DATA
还是CELL_DATA
都没关系)。然后,其他关键字/数据组合定义实际的数据集属性值(即标量,向量,张量,法线,纹理坐标或字段数据)。
文件格式的概述如图1所示。前三个部分是必需的,而另两个部分是可选的。因此,您可以通过操作系统文件或使用VTK过滤器合并数据,灵活地混合与匹配几何、数据集属性。关键字不区分大小写,可以用空格分隔。
图1 VTK数据文件格式的五个部分的概述在描述数据文件格式之前,请注意以下几点。
dataType
是bit,unsigned_char,char,unsigned_short,short,unsigned_int,int,unsigned_long,long,float
或double
的类型之一。这些关键字用于描述数据的形式,既可以从文件中读取,也可以构造适当的内部对象。并非所有类都支持所有数据类型。只要遵守两个条件,VTK中的二进制文件即可在不同的计算机系统之间移植。首先,确保数据的字节顺序正确,其次,确保每种数据类型的长度一致。
大多数时候,VTK会为您管理二进制文件的字节顺序。当您在一台计算机上写入二进制文件并从另一台计算机读取该文件时,表示数据的字节将根据需要自动交换。例如,在Sun上写入的二进制文件以大字节序存储,而在PC上的二进制文件则以小字节序存储。因此,在PC上读取时,写在Sun工作站上的文件需要字节交换。(有关实现的详细信息,请参见类vtkByteSwap
)此处描述的VTK数据文件以大端格式书写。
但是,某些文件格式未明确定义字节顺序形式。您会发现由外部程序或类vtkVolume16Reader
,vtkMCubesReader
和vtkMCubesWriter
读取或写入的数据可能具有不同的字节顺序,具体取决于原始系统。在这种情况下,VTK允许您使用方法指定字节顺序:
SetDataByteOrderToBigEndian()
SetDataByteOrderToLittleEndian()
二进制文件的另一个问题是系统可能使用不同数量的字节来表示整数或其他本机类型。例如,某些64位系统将表示一个8字节的整数,而另一些系统将表示一个4字节的整数。当前,VTK无法处理跨数据长度不兼容的系统中的二进制文件传输。 在这种情况下,请改用ASCII文件格式。
可视化工具包支持五种不同的数据集格式:结构化点(structured points)、结构化网格(structured grid)、直线型网格(rectilinear grid)、非结构化网格(unstructured grid)和多边形数据(polygonal data)。具有隐式拓扑的数据(结构化数据,例如vtkImageData和vtkStructuredGrid)的顺序是x增长最快,然后是y,然后是z。
这些格式如下:
文件格式支持1D,2D和3D结构化点数据集。尺寸nx
,ny
,nz
必须大于或等于1。数据间距sx
,sy
,sz
必须大于0。(注意:在1.0版数据文件中,间距称为“纵横比”。ASPECT_RATIO
仍可以在2.0版数据文件中使用,但不建议使用。)
DATASET STRUCTURED_POINTS
DIMENSIONS nx ny nz
ORIGIN xyz
SPACING sx sy sz
该文件格式支持1D,2D和3D结构化网格数据集。尺寸nx
,ny
,nz
必须大于或等于1。点坐标由POINTS
部分中的数据定义。这由每个点的x-y-z坐标数据值组成。
DATASET STRUCTURED_GRID
DIMENSIONS nx ny nz
POINTS n dataType
p0x p0y p0z
p1x p1y p1z
...
p(n-1)x p(n-1)y p(n-1)z
直线网格定义具有规则拓扑和沿x-y-z坐标轴对齐的半规则几何的数据集。几何形状由三个单调递增的坐标值列表定义,每个x-y-z坐标轴都有一个列表。 通过指定网格尺寸(必须大于或等于1)来定义拓扑。
DATASET RECTILINEAR_GRID
DIMENSIONS nx ny nz
X_COORDINATES nx dataType
x0 x1 ... x(nx-1)
Y_COORDINATES ny dataType
y0 y1 ... y(ny-1)
Z_COORDINATES nz dataType
z0 z1 ... z(nz-1)
多边形数据集由曲面图形基元顶点(和多顶点),线(和折线),多边形(各种类型)和三角形带的任意组合组成。多边形数据由POINTS
,VERTICES
,LINES
,POLYGONS
或TRIANGLE_STRIPS
部分定义。POINTS
定义与我们看到的结构化网格数据集相同。VERTICES
,LINES
,POLYGONS
或TRIANGLE_STRIPS
关键字定义多边形数据集拓扑。
这些关键字中的每一个都需要两个参数:单元数n和单元列表大小的size。单元列表大小是表示列表所需的整数值的总数(即,每个单元上的numPoints和连接性索引的总和)。关键字VERTICES
,LINES
,POLYGONS
或TRIANGLE_STRIPS
是可选的。
DATASET POLYDATA
POINTS n dataType
p0x p0y p0z
p1x p1y p1z
...
p(n-1)x p(n-1)y p(n-1)z
VERTICES n size
numPoints0, i0, j0, k0, ...
numPoints1, i1, j1, k1, ...
...
numPointsn-1, in-1, jn-1, kn-1, ...
LINES n size
numPoints0, i0, j0, k0, ...
numPoints1, i1, j1, k1, ...
...
numPointsn-1, in-1, jn-1, kn-1, ...
POLYGONS n size
numPoints0, i0, j0, k0, ...
numPoints1, i1, j1, k1, ...
...
numPointsn-1, in-1, jn-1, kn-1, ...
TRIANGLE_STRIPS n size
numPoints0, i0, j0, k0, ...
numPoints1, i1, j1, k1, ...
...
numPointsn-1, in-1, jn-1, kn-1, ...
非结构化网格数据集由任何可能单元类型的任意组合组成。由点points
、单元cells
和单元类型cell_types
定义。
cells
关键字需要两个参数:单元数n和单元列表大小的大小。单元列表大小是表示列表所需的整数值的总数(即,每个单元上的numPoints
和连接性索引的总和)。CELL_TYPES
关键字需要一个参数:单元数n。该值应与CELLS关键字指定的值匹配。单元类型数据是为各个单元类型的指定单个整数值(请参阅vtkCell.h或图2)
DATASET UNSTRUCTURED_GRID
POINTS n dataType
p0x p0y p0z
p1x p1y p1z
...
p(n-1)x p(n-1)y p(n-1)z
CELLS n size
numPoints0, i, j, k, l, ...
numPoints1, i, j, k, l, ...
numPoints2, i, j, k, l, ...
...
numPointsn-1, i, j, k, l, ...
CELL_TYPES n
type0
type1
type2
...
typen-1
场数据是没有拓扑和几何结构,也没有特定维度的通用格式。通常,场数据与数据集的点或单元关联。但是,如果将FIELD类型指定为数据集类型(参见图1),则将定义常规VTK数据对象。使用下一部分中描述的格式来定义字段。
VTK支持以下数据集属性:标量(1到4个分量),向量,法线,纹理坐标(1D,2D和3D),张量和字段数据。另外,还可以定义使用RGBA颜色规范的查找表,并与标量数据相关联。点和单元都支持数据集属性。
每种类型的属性数据都有一个与之关联的dataName。这是用于标识特定数据的字符串(无嵌入空格)。VTK读取器使用dataName提取数据。结果,一个文件中可以包含多个相同类型的属性数据。例如,在数据集点上定义的两个不同的标量字段(压力和温度)可以包含在同一文件中。(如果未在VTK读取器中指定适当的dataName,则将从文件中提取该类型的第一个数据。)
标量定义包括查找表的规范。查找表的定义是可选的。如果未指定,将使用默认的VTK表(tableName为“default”)。另请注意,numComp
变量是可选的,默认情况下组件的数量等于1。(参数numComp
必须介于[1,4]之间;在vtk2.3之前的VTK版本中,不支持此参数。)
SCALARS dataName dataType numComp
LOOKUP_TABLE tableName
s0
s1
...
sn-1
颜色标量(即直接映射到颜色的无符号字符值)的定义根据每个标量的值(nvalue)的数量而变化。如果文件格式是ASCII,则颜色标量是使用(0,1)之间的nValues浮点值定义的。如果文件格式为BINARY
,则数据流由nValues每个标量值的无符号字符值组成。
COLOR_SCALARS dataName nValues
c00 c01 ... c0(nValues-1)
c10 c11 ... c1(nValues-1)
...
c(n-1)0 c(n-1)1 ... c(n-1)(nValues-1)
tableName字段是一个字符串(没有嵌入空格),用于标识查找表。VTK读取器使用此标签来提取特定的表。
查找表中的每个条目都是一个rgba[4]数组(alpha=0时为透明)。如果文件格式为ASCII,则查找表值必须是介于(0,1)之间的浮点值。如果文件格式为二进制,则数据流必须是每个表项的四个无符号字符值。
LOOKUP_TABLE tableName size
r0 g0 b0 a0
r1 g1 b1 a1
...
rsize-1 gsize-1 bsize-1 asize-1
VECTORS dataName dataType
v0x v0y v0z
v1x v1y v1z
...
v(n-1)x v(n-1)y v(n-1)z
法线假定为标准化| n |=1。
NORMALS dataName dataType
n0x n0y n0z
n1x n1y n1z
...
n(n-1)x n(n-1)y n(n-1)z
支持123维的纹理坐标。
TEXTURE_COORDINATES dataName dim dataType
t00 t01 ... t0(dim-1)
t10 t11 ... t1(dim-1)
...
t(n-1)0 t(n-1)1 ... t(n-1)(dim-1)
目前只支持实值对称张量。
TENSORS dataName dataType
t0 00 t0 01 t0 02
t0 10 t0 11 t0 12
t0 20 t0 21 t0 22
t1 00 t1 01 t1 02
t1 10 t1 11 t1 12
t1 20 t1 21 t1 22
...
t n-1 00 t n-1 01 t n-1 02
t n-1 10 t n-1 11 t n-1 12
t n-1 20 t n-1 21 t n-1 22
字段数据本质上是一组数据数组。定义字段数据意味着给字段命名并指定它包含的数组数。对于每个数组,都定义了如下的量:数组的名称arrayName(i)、数组的维数numComponents
、数组中元组的数量numTuples
、数据类型dataType
。
FIELD dataName numArrays
arrayName0 numComponents numTuples dataType
f00 f01 ... f0(numComponents-1)
f10 f11 ... f1(numComponents-1)
...
f(numTuples-1)0 f(numTuples-1)1 ... f(numTuples-1)(numComponents-1)
arrayName1 numComponents numTuples dataType
f00 f01 ... f0(numComponents-1)
f10 f11 ... f1(numComponents-1)
...
f(numTuples-1)0 f(numTuples-1)1 ... f(numTuples-1)(numComponents-1)
...
arrayName(numArrays-1) numComponents numTuples dataType
f00 f01 ... f0(numComponents-1)
f10 f11 ... f1(numComponents-1)
...
f(numTuples-1)0 f(numTuples-1)1 ... f(numTuples-1)(numComponents-1)
第一个例子是由六个多边形面表示的立方体。我们在六个面上定义了一个单分量标量、法线和场数据。有与八个顶点相关联的标量数据。还定义了与点标量相关联的八种颜色的查找表。
# vtk DataFile Version 2.0
Cube example
ASCII
DATASET POLYDATA
POINTS 8 float
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
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
SCALARS cell_scalars int 1
LOOKUP_TABLE default
0
1
2
3
4
5
NORMALS cell_normals float
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
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
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
下一个例子是3×4×5维的结构化点数据集。由于没有定义查找表,因此用户必须在VTK中创建一个查找表,否则将使用默认的查找表。
# vtk DataFile Version 2.0
Volume example
ASCII
DATASET STRUCTURED_POINTS
DIMENSIONS 3 4 6
ASPECT_RATIO 1 1 1
ORIGIN 0 0 0
POINT_DATA 72
SCALARS volume_scalars char 1
LOOKUP_TABLE default
0 0 0 0 0 0 0 0 0 0 0 0
0 5 10 15 20 25 25 20 15 10 5 0
0 10 20 30 40 50 50 40 30 20 10 0
0 10 20 30 40 50 50 40 30 20 10 0
0 5 10 15 20 25 25 20 15 10 5 0
0 0 0 0 0 0 0 0 0 0 0 0
第三个例子是一个非结构化网格,包含19种VTK单元类型中的12种(参见图2和图3)。该文件包含标量和矢量数据。
# vtk DataFile Version 2.0
Unstructured Grid Example
ASCII
DATASET UNSTRUCTURED_GRID
POINTS 27 float
0 0 0 1 0 0 2 0 0 0 1 0 1 1 0 2 1 0
0 0 1 1 0 1 2 0 1 0 1 1 1 1 1 2 1 1
0 1 2 1 1 2 2 1 2 0 1 3 1 1 3 2 1 3
0 1 4 1 1 4 2 1 4 0 1 5 1 1 5 2 1 5
0 1 6 1 1 6 2 1 6
CELLS 11 60
8 0 1 4 3 6 7 10 9
8 1 2 5 4 7 8 11 10
4 6 10 9 12
4 5 11 10 14
6 15 16 17 14 13 12
6 18 15 19 16 20 17
4 22 23 20 19
3 21 22 18
3 22 19 18
2 26 25
1 24
CELL_TYPES 11
12
12
10
10
7
6
9
5
5
3
1
POINT_DATA 27
SCALARS scalars float 1
LOOKUP_TABLE default
0.0 1.0 2.0 3.0 4.0 5.0
6.0 7.0 8.0 9.0 10.0 11.0
12.0 13.0 14.0 15.0 16.0 17.0
18.0 19.0 20.0 21.0 22.0 23.0
24.0 25.0 26.0
VECTORS vectors float
1 0 0 1 1 0 0 2 0 1 0 0 1 1 0 0 2 0
1 0 0 1 1 0 0 2 0 1 0 0 1 1 0 0 2 0
0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1
0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1
0 0 1 0 0 1 0 0 1
第四个也是最后一个示例是用字段表示的数据。您可能还希望在第158页看到“使用字段数据”来了解如何操作这些数据。
(下面显示的数据文件可以在$VTK_data_ROOT/data/financial.vtk.中找到)
# vtk DataFile Version 2.0
Financial data in vtk field format
ASCII
FIELD financialData 6
TIME_LATE 1 3188 float
29.14 0.00 0.00 11.71 0.00 0.00 0.00 0.00
...(more stuff — 3188 total values)...
MONTHLY_PAYMENT 1 3188 float
7.26 5.27 8.01 16.84 8.21 15.75 10.62 15.47
...(more stuff)...
UNPAID_PRINCIPLE 1 3188 float
430.70 380.88 516.22 1351.23 629.66 1181.97 888.91 1437.83
...(more stuff)...
LOAN_AMOUNT 1 3188 float
441.50 391.00 530.00 1400.00 650.00 1224.00 920.00 1496.00
...(more stuff)...
INTEREST_RATE 1 3188 float
13.875 13.875 13.750 11.250 11.875 12.875 10.625 10.500
...(more stuff)...
MONTHLY_INCOME 1 3188 unsigned_short
39 51 51 38 35 49 45 56
...(more stuff)...
在本例中,一个字段用六个数组表示。每个数组都有一个组件和3188个元组。六个数组中有五个是float
类型,而最后一个数组的类型是unsigned_short
。数据目录中提供了其他示例。
VTK使用XML语法提供了另一组数据格式。而这些格式比传统VTK格式,它们支持更多的功能。其开发的主要动机是促进数据流和并行I/O,包括对压缩、可移植二进制编码、随机存取、大端和小端字节顺序、工件数据的多文件表示以及不同VTK数据集类型的新文件扩展名的支持。XML还提供了许多特性,尤其是使用特定于应用程序的标记扩展文件格式的能力。
vtkxml数据文件有两种类型:并行和串行,如下所述......
【完】
就翻译到这里。最后,放个此文档在线编辑地址,欢迎补充。
金山文档 | VTK-file-formatkdocs.cn★★★★★★ 相关推荐 ★★★★★★