vtk中通过vtkDataArray进行数据的存储,通过vtkDataObject进行可视化数据的表达,在vtkDataObject内部有一个vtkFieldData的实例,负责对数据的表达:
vtkFieldData存储数据的属性数据,该数据是对拓扑结构和几何结构信息的补充。属性数据可以是某个空间点的温度或某个单元的质量等。在vtk中与数据集的点数据相关联的属性数据用vtkPointData表达,与单元数据相关联的属性数据用vtkCellData表达。
其属性内容都用vtkDataArray来存储,如<vtkDoubleArray>来存储某个空间点或者几何结构的某个属性。
例子1,几何结构点point对象的属性设置:
- 实例化一个 vtkUnstructuredGrid 对象
unStructGrid
- 设置节点序列信息
cells
和单元序列信息points
- 需要渲染节点属性信息时,通过预先设置好的节点属性信息
Scalars
进行赋值,并且通过SetScalarModeToUsePointData()
方法设置 mapper 只显示节点属性
unStructGrid->GetPointData()->SetScalars(Scalars);
ugridMapper->SetScalarModeToUsePointData();
例子2,拓扑结构cell对象的属性设置:
需要渲染单元属性信息时,通过事先设置好的单元属性信息Scalars
进行赋值,并且通过 SetScalarModeToUseCellData()
方法设置 mapper 只显示单元属性
unStructGrid->GetCellData()->SetScalars(Scalars);
ugridMapper->SetScalarModeToUseCellData();
例子3,这里说明了如何创造并将数据写入一个属性数组scalars:
// 创建一个属性数组scalars,存放点的属性vtkSmartPointer<vtkDoubleArray> scalars = vtkSmartPointer<vtkDoubleArray>::New();
// 填充点云数据(示例数据)double point[3] = { 0.0, 0.0, 0.0 };double pixel;for (int k = 0; k < dims[2]; k++)// dims[2]; k++){for (int j = 0; j < dims[1]; j++)//dims[1]; j++){for (int i = 0; i < dims[0]; i++){pixel = imageData->GetScalarComponentAsDouble(i, j, k, 0);//获取组分作为属性数据if (pixel > 0){point[0] = i; //X轴横坐标point[1] = j; //Y轴纵坐标point[2] = pixel; //Z轴高度vtkIdType pId[1]; //定义用来存储点的坐标的中间变量,vtkIdType相当int long等类型points->InsertNextPoint(point); //把点坐标加入VTKPoints中,InserNextPoint()返回加入这些point点依次在VTKPoints中的索引; pId[0] = points->InsertNextPoint(point); //获取要插入cell的pint点的坐标数据。vertics->InsertNextCell(1, pId); //将VTKPoints的内容加入拓扑结构cell中,这里每将point点加入VTKPoints一次,就将这个VTKPoints加入cell一次。vtkCellArray::InsertNextCell ( vtkIdType npts, vtkIdType * pts )的第一个参数值标是这个cell中点的个数,第二个参数指向那些点的坐标数据。vtkIdType *pts,存储的是所包括点在points中的顺序信息,其个数当然应该和前面的npts一致。这里,2点可以连成一条线,三点可以得到一个面。//也就是说:vtk中关于点、线、面的那些信息都是存放在cellarray中,应用时也是直接对cellarray指针进行处理,数据的写入和读取在vtkCellArray类完成。scalars->InsertNextValue(pixel); //属性数组scalars,用来存放点属性polydata->SetPoints(points);//加入三维点polydata->SetVerts(vertics);//加入三维点的点索引//还是需要标量scalars来表示高度,并用这个标量进行映射// // scalars->InsertTuple1(i, pixel);//这个格式好像不对// //polydata->GetPointData()->SetScalars(scalars);//加入点属性//cout << "高度scalars=" << scalars << endl;}}}}
——————————————————————————————————
在 VTK中,数据集的几何数据表示为Points (点集),拓扑关系表示为Cell(单元),属性数据包括Scalar(标量)、Vector(向量)、Normal(法线)、Texture(纹理)等。
在VTK中数据集的类型主要按构成数据集的几何数据和单元来划分,主要的数据集类型包括:Structured Points(结构化点集)【vtkStructuredPoints 的父类是vtkImageData】、Unstructured Points (非结构化点集)、Poly Data(多边形数据集)、Structured Grid(结构化网格数据集)、Unstructured Grid(非结构化网格数据集)、Rectilinear Grid(线性网格数据集)等几大类,各类的表现形式如下图所示。
(1) Structured Points
按规则排列的点的集合。点的排列和坐标轴平行,形成方形的点阵。vtkStructuredPoints 的父类是vtkImageData,vtkImageData是vtkDataSet的子类。
(2) Unstructured Points
不规则地分布在空间的点集。非结构化点集具有不规则的几何结构,但不具有拓扑结构,用离散点来表达,通常,这类数据没有固定的结构,是由一些可视化程序识别和创建的。
(3) Poly Data
在VTK中多边形数据集是由顶点、多顶点、线、多线、多边形各三角带构成,多边形数据是非结构化的,并且多边形数据集的单元在拓扑维度上有多种变化,顶点、线和多边形构成了用来表达0、1和2维几何图形的基本要素的最小集合,同时用多顶点、多线和三角形带单元来提高效率和性能,特别是用一个三角形带表达N个三角形只需要用N+2个点,但是用传统的表达方法需要用3N个点。vtkPolyData的父类是vtkPointSet,vtkPointSet是vtkDataSet的子类。
(4) Structured Grid
具有规则的拓扑结构和不规则的几何结构,但是单元没有重叠或交叉。vtkStructuredGrid的父类是vtkPointSet。
(5) Unstructured Grid
非结构化网格集是最常见的数据集类型,它的拓扑结构和几何结构都是非结构化的,在此数据集中所有单元类型都可以组成任意组合,所以单元的拓扑结构从零维延伸至三维,在 VTK中任一类型的数据集都可用非结构化网格来表达。vtkUnstructuredGrid的父类是vtkPointSet。
(6) Rectilinear Grid
是排列在矩形方格中的点和单元的集合,线性网格的拓扑结构是规则的,但其几何结构只有一部分是规则的,也就是说,它的点是沿着坐标轴排列的,但是两点间的间隔可能不同。vtkRectilinearGrid的父类是vtkDataSet。
3.可视化数据集部分的 VTK类列表