“VTK图形图像开发进阶_张晓东_罗火灵”的学习笔记。
东灵工作室 教程系列导航:http://blog.csdn.net/www_doling_net/article/details/8763686
VTK官网学习地址:https://vtk.org/doc/nightly/html/
(1) 离散性
为了让计算机能够获取、处理和分析数据,必须对无限、连续的空间体进行采样,生成 有限的釆样数据点,这些数据以离散点的形式存储,釆样的过程是一个离散化的过程。
(2)数据具有规则或不规则的结构(结构化与非结构化)
对于规则结构的数据,存储时不必存储所有数据点,只需存储起始点、相邻点之间的间隔以及点的总数就可以保存完整的数据信息即在存储及计算时占优势。对于不规则结构 的数据虽然在存储和计算时不能像规则结构那样高效,但它在数据表达方面相对而言更加自 由、细致、灵活。
(3)数据具有维度
如零维数据表现为点,一维数据表现为曲线,二维数据表现为曲面,三维表现为体等
数据对象 vtkDataObject
下图vtkDataObject类的继承图,VTK里的所有数据结构形式都是从这个类派生出来 的,但在实际的VTK应用程序中,没有直接使用vtkDataObject来实例化数据对象,而是根 据具体的可视化数据选用其具体的子类实现可视化的。
数据对象 vtkDataSet
将数据对象组织成一种结构并且赋予相应的属性值,就形成了数据集(Dataset)。VTK 里与数据集对应的类是vtkDataSet,该类从vtkDataObject直接派生。vtkDataSet由两个部 分组成,即组织结构以及与组织结构相关联的属性数据。
vtkDataSet的组织结构由拓扑结构和几何结构两部分组成
拓扑结构描述了对象的构成形式,几何结构描述了对象的空间位置关系。换言之,点数据所定义的一系列坐标点构成了vtkDataSet数据集的几何结构;点数据的连接形成单元数据,由单元数据形成了数据集的拓扑结构。
比如,想要在屏幕上显示一个三角形,首先必须定义三角形三个点的坐标(即Point Data, 记三个点为Pl、P2和P3),然后将这三个点按照一定的顺序连接起来(P1-P2-P3,或者是 P3-P2-P1的顺序),这三个点定义了数据集的几何结构,它们的连接就构成了数据集的拓扑 结构,亦即点数据定义了数据集的几何结构,单元数据定义数据集的拓扑结构,要形成完整的数据集,必须有几何和拓扑两种结构。
VTK支持的线性和非线性类型的单元。
一系列有序的点按指定类型连接所定义的结构就是单元,单元是VTK可视化系统的基础。这些顺序连接的点定义了单元的拓扑结构,而点的坐标定义了单元的几何结构。
下图为线性的单元类型
a) Vertex b) Polyvertex c) Line d) Polyline(n lines) e) Triangle f) Triangle strip(n triangles) g) Quadrilateral h) Pixel
i) Polygon(n points) j) Tetrahedron k) Hexahedron I) Voxel m) Wedge n) Pyramid o) Pentagonal Prism p) Hexagonal Prism
下图为非线性的单元类型
a) Quadratic Edge b) Quadratic Triangle c) Quadratic Linera Quad d) Quadratic Quad e) Bi- Quadratic Quad f) Quadratic
Tetrahedron g) Quadratic Pyramid h) Quadratic Hexahedron i) Bi- Quadratic Hexahedron j) Tri- Quadratic Hexahedron
k) Quadratic Linear Wedge I) Quadratic Wedge m) Bi-Quadratic Wedge
单元类型在VTK中的枚举
vtkCellType.h
typedef enum {
// Linear cells
VTK_EMPTY_CELL = 0,
VTK_VERTEX = 1,
VTK_POLY_VERTEX = 2,
VTK_LINE = 3,
VTK_POLY_LINE = 4,
VTK_TRIANGLE = 5,
VTK_TRIANGLE_STRIP = 6,
VTK_POLYGON = 7,
VTK_PIXEL = 8,
VTK_QUAD = 9,
VTK_TETRA = 10,
VTK_VOXEL = 11,
VTK_HEXAHEDRON = 12,
VTK_WEDGE = 13,
VTK_PYRAMID = 14,
VTK_PENTAGONAL_PRISM = 15,
VTK_HEXAGONAL_PRISM = 16,
// Quadratic, isoparametric cells
VTK_QUADRATIC_EDGE = 21,
VTK_QUADRATIC_TRIANGLE = 22,
VTK_QUADRATIC_QUAD = 23,
VTK_QUADRATIC_POLYGON = 36,
VTK_QUADRATIC_TETRA = 24,
VTK_QUADRATIC_HEXAHEDRON = 25,
VTK_QUADRATIC_WEDGE = 26,
VTK_QUADRATIC_PYRAMID = 27,
VTK_BIQUADRATIC_QUAD = 28,
VTK_TRIQUADRATIC_HEXAHEDRON = 29,
VTK_QUADRATIC_LINEAR_QUAD = 30,
VTK_QUADRATIC_LINEAR_WEDGE = 31,
VTK_BIQUADRATIC_QUADRATIC_WEDGE = 32,
VTK_BIQUADRATIC_QUADRATIC_HEXAHEDRON = 33,
VTK_BIQUADRATIC_TRIANGLE = 34,
// Cubic, isoparametric cell
VTK_CUBIC_LINE = 35,
// Special class of cells formed by convex group of points
VTK_CONVEX_POINT_SET = 41,
// Polyhedron cell (consisting of polygonal faces)
VTK_POLYHEDRON = 42,
// Higher order cells in parametric form
VTK_PARAMETRIC_CURVE = 51,
VTK_PARAMETRIC_SURFACE = 52,
VTK_PARAMETRIC_TRI_SURFACE = 53,
VTK_PARAMETRIC_QUAD_SURFACE = 54,
VTK_PARAMETRIC_TETRA_REGION = 55,
VTK_PARAMETRIC_HEX_REGION = 56,
// Higher order cells
VTK_HIGHER_ORDER_EDGE = 60,
VTK_HIGHER_ORDER_TRIANGLE = 61,
VTK_HIGHER_ORDER_QUAD = 62,
VTK_HIGHER_ORDER_POLYGON = 63,
VTK_HIGHER_ORDER_TETRAHEDRON = 64,
VTK_HIGHER_ORDER_WEDGE = 65,
VTK_HIGHER_ORDER_PYRAMID = 66,
VTK_HIGHER_ORDER_HEXAHEDRON = 67,
// Arbitrary order Lagrange elements (formulated separated from generic higher order cells)
VTK_LAGRANGE_CURVE = 68,
VTK_LAGRANGE_TRIANGLE = 69,
VTK_LAGRANGE_QUADRILATERAL = 70,
VTK_LAGRANGE_TETRAHEDRON = 71,
VTK_LAGRANGE_HEXAHEDRON = 72,
VTK_LAGRANGE_WEDGE = 73,
VTK_LAGRANGE_PYRAMID = 74,
VTK_NUMBER_OF_CELL_TYPES
} VTKCellType;
#endif
属性数据是与数据集的组织结构相关联的信息。由前面的内容可知,组织结构包括几何结构及拓扑结构,几何结构由点数据定义,拓扑结构由单元数据定义。
根据数据的性质,属性数据可分为标量数据、矢量数据、张量数据等几大类
属性数据主要用于描述数据集的属性特征,对数据集的可视化实质上就是对属性数据的 可视化,例如,根据压力监测数据构建一个压力场可视化数据集后,数据集中的每个数据点 (几何数据)或单元都必须有对应的属性数据,VTK根据属性数据设置颜色表,用不同的颜 色表示不同的压力,通过颜色的变化情况,可以直观地分析出压力的变化趋势。
在VTK中,用vtkPointData类和vtkCellData类表达数据集属性,它们是类vtkDataSet Attributes (vtkDataSetAttributes派生自vtkFieldData)的子类,构成数据集的每个点(或单元)。
和属性数据之间存在一对一的关系,如一个数据集由N个点(或单元)构成,那么必须有N 个属性数据和这N个点(或单元)一一对应,通过点的索引号就可以对该点的属性数据进行 访问,例如,在数据集aDataSet中访问索引号为129的点的标量值时(假设标量数据已被定 义且不为空)使用如下方法。
获取标量值
#include
#include
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)
#include
#include
#include
#include
#include
#include
int main(int, char *[])
{
//创建点集数据:包含两个坐标点。
vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
points->InsertNextPoint(0,0,0);
points->InsertNextPoint(1,0,0);
//创建多边形数据。
vtkSmartPointer<vtkPolyData> polydata = vtkSmartPointer<vtkPolyData>::New();
polydata->SetPoints(points);
//准备加入点数据的标量值,两个标量值分别为1和2。
vtkSmartPointer<vtkDoubleArray> weights = vtkSmartPointer<vtkDoubleArray>::New();
weights->SetNumberOfValues(2);
weights->SetValue(0, 5277);
weights->SetValue(1, 2);
//先获取多边形数据的点数据指针,然后设置该点数据的标量属性值。
polydata->GetPointData()->SetScalars(weights);
//输出索引号为0的点的标量值。
double weight = vtkDoubleArray::SafeDownCast(polydata->GetPointData()->GetScalars())->GetValue(0);
std::cout << "double weight: " << weight << std::endl;
return EXIT_SUCCESS;
}
矢量数据
与物理学的矢量概念一样,VTK的矢量数据也是指既有大小也有方向的量,三维方向上 用三元组(Triple)表示为(u, v, w),如速度、应力、位移等。
除了矢量数据用三元组表示,颜色等标量数据也会用类似三元组的结构表示。
纹理坐标
为了使物体看起来更加真实,计算机图形学通常对显示的三维物体采用纹理映射。纹理 坐标可以将点从笛卡儿坐标空间映射到一维、二维或三维的纹理空间中。
张量数据
张量是矢量和矩阵通过复杂的数学算法得到的,一个k阶的张量可当作一个k维的表格。 零阶的张量是标量,一阶的张量是矢量,二阶的张暈是纹理坐标,三阶的张量是一个三维阵 列,VTK只支持3X3的对称的张量。
数据集由组织结构和与之关联的属性数据组成,组织结构包括拓扑结 构和几何结构。数据集的类型由它的组织结构决定,同时数据集的类型决定了点和单元之间 的相互关系,图3-11列出了常用的数据集类型。
对应的类的继承图
vtkDataArray
VTK是如何创建数据数组的:
创建固定长度的数据数组
vtkSmartPointer< vtkFloatArray > array = vtkSmartPointer< vtkFloatArray >::New();
array->SetNumberOfComponents(1);
array->SetNumberOfTuples(l0);
array->SetComponent(5, 0, 10.0);
array->SetTuplel(6, 9.0);
double b = array->GetComponent(5,0);
vtkSmartPointer< vtkFloatArray > array = vtkSmartPointer< vtkFloatArray >::New();
airay->SetNumberOfComponents( 1);
array->InsertNextTuple1 (5);
array->InsertNextTuple1(10);
double b = array->GetComponent(1, 0);
以上代码首先设置每个元组的组分个数为1,方法InsertNextTuplel()用于插入一个单组分 的元组,连续调用两次即为插入两个元组,其值分别为5和10,类似的方法还有 InsertNextTuple2(), InsertNextTuple3(), InsertNextTuple4(), InsertNextTuple9()等。
(1)vtkDataObject
VTK中的数据一般是以数据对象的形式表现的,vtkDataObject是VTK可视化数据最常 用的表达形式,数据对象表现的数据可被可视化管线所处理,当数据对象组织成一种结构以 后,这些数据才能被VTK的可视化算法处理。
将数据对象组织成一种结构并且赋予相应的属性值时就形成数据集(vtkDataSet)。类 vtkDataSet是从vtkDataObject派生的.vtkDataSet的组织结构由拓扑结构和几何 结构两部分组成。
(2)vtkDataArray
数据数组vtkDataArray及其子类是建立VTK数据对象的基础。 不同类型的数据对象(如vtkDataSet)都含有几何结构和拓扑结构信息,而这些结构信息的存储就是使用vtkDataArray及其子类,比如vtkPolyData里的vtkCellArray存储拓扑结构信息。
(3)vtkFieldData
数据集里的属性数据是对拓扑结构和几何结构信息的补充,属性数据可以是某个空间点 的温度值,也可以是某个单元的质量等。与数据集的点数据相关联的属性数据用vtkPointData 来表达,与单元数据相关联的属性数据用vtkCellData来表达,从图3-16可以看出,类 vtkPointData 和 vtkCellData 都派生自 vtkDataSetAttributes.而 vtkDataSetAttributes 派生自 vtkFieldData,换言之,可以使用vtkFieldData来存储像颜色、加速度、标号、名字、温度、 质量等等这些属性数据。一般的用法是:
dataset->GetPointDataO->AddArray(attributeArray);