VTK中的可视化管线可用于读取或创建数据、分析和创建此数据的派生版本,并将数据写入磁盘或将其传递给渲染引擎进行显示。例如,您可以从磁盘读取一个三维数据体,对其进行处理以创建一组三角形,这些三角形通过该数据体表示一个等值曲面,然后将该几何对象写回磁盘。或者,您可以创建一组球体和圆柱体来表示原子和键,然后将其传递给渲染引擎进行显示。
VTK使用数据流方法将信息转换为图形数据。此方法涉及两种基本类型的对象。
• vtkDataObject
• vtkAlgorithm
数据对象表示各种类型的数据。vtkDataObject类可以看作是一个通用的数据块。具有正式结构的数据称为数据集(vtkDataSet类)。图3-2显示了VTK支持的数据集对象。数据集由几何和拓扑结构(点和单元格)组成;它们还具有相关的属性数据,如标量或向量。属性数据可以与数据集的点或单元格相关联。单元格是点的拓扑组织;单元格是构成数据集的原子,用于在点之间插入信息。图19-20和图19-21显示了VTK支持的23种最常见的单元格类型。图3-3显示了VTK支持的属性数据。
算法(也称为过滤器)对数据对象进行操作以生成新的数据对象。算法和数据对象连接在一起,形成可视化管线(即数据流网络)。图3-4是可视化管线的描述。此图与图3-5一起说明了一些重要的可视化概念。源算法通过读取(读取器对象)或构造一个或多个数据对象(过程源对象)来生成数据。过滤器接收一个或多个数据对象,并在输出时生成一个或多个数据对象。映射器(某些情况下专门道具)获取数据并将其转换为渲染引擎显示的视觉渲染。写入器可以看作是一种将数据写入文件或流的映射器。
关于可视化管线的构建,我们将在这里简要介绍几个重要问题。首先,使用各种方法构造管线拓扑:
aFilter->SetInputConnection( anotherFilter->GetOutputPort() );
它将一个过滤器的输入设置为另一个过滤器的输出。具有多个输入和输出的过滤器具有类似的方法。其次,我们必须有一种控制管线执行的机制。我们只想执行管线中使输出更新所需的部分。VTK基于每个对象的内部修改时间使用延迟评估方案(仅在请求数据时执行)。第三,管线的组装要求只有那些彼此兼容的对象才能与SetInputConnection()和GetOutputPort()方法配合使用。如果数据对象类型不兼容,VTK会在运行时产生错误。最后,我们必须决定在管线执行后是缓存还是保留数据对象。由于可视化数据集通常相当大,这对于可视化工具的成功应用非常重要。VTK提供了打开和关闭数据缓存的方法、使用引用计数避免复制数据的方法,以及在整个数据集无法保存在内存中时以片段形式流式传输数据的方法。
请注意,算法和数据对象都有很多种类。图16-2显示了VTK支持的六种最常见的数据对象类型。算法对象在其输入数据和输出数据的类型上有所不同,在实现的特定算法中也有所不同。
Figure 3–3 Data attributes associated with the points and cells of a dataset.
管线执行.上一节中,我们讨论了控制可视化管线执行的必要性。在本节中,我们将扩展对有关管线执行的一些关键概念的理解。如前一节所述,VTK可视化管线仅在需要数据进行计算(延迟评估)时执行。考虑这个示例,我们实例化了一个读取器对象,并要求提供如下所示的点数。
vtkSmartPointer<vtkJPEGReader> reader = vtkSmartPointer<vtkJPEGReader>::New();
reader->SetFileName("Data\\clouds.jpeg");
auto data = reader->GetOutput();
qDebug() << data->GetNumberOfPoints();
读取器对象将从GetNumberOfPoints()方法调用返回0,尽管数据文件包含数千个点。但是,如果添加Update()方法
reader->Update();
int number = data->GetNumberOfPoints();
读取器对象将返回正确的数字。在第一个示例中,GetNumberOfPoints()方法不需要计算,对象只返回当前点的数量,即0。在第二个示例中,Update()方法强制执行管线,从而强制reader执行并读取所示文件中的数据。读取器执行后,其输出中的点数将正确设置。
通常,您不需要手动调用Update(),因为过滤器连接到可视化管线中。在这种情况下,当参与者收到渲染自身的请求时,它会将该方法转发给映射器,Update()方法会通过可视化管线自动发送。管线执行的高级视图如图3-6所示。如图中所示,Render()方法通常会启动数据请求;然后通过管线向上传递该请求。根据管线的过期部分,管线中的过滤器可能会重新执行,从而使管线末端的数据更新;然后由参与者呈现最新数据。
图像处理. VTK支持一系列广泛的图像处理和体积渲染功能。在VTK中,2D(图像)和3D(体积)数据都称为vtkImageData。VTK中的图像数据集是将数据排列在规则的轴对齐数组中的数据集。图像、像素地图和位图是2D图像数据集的示例;体积(二维图像的几何)是一个三维图像数据集。
图像管线中的算法总是输入和输出图像数据对象。由于数据的规则性和简单性,图像管线具有其他重要特征。体积渲染用于可视化三维vtkImageData,特殊图像查看器用于查看二维vtkImageData。图像管线中的几乎所有算法都是多线程的,并且能够将数据分块流式传输,以满足用户指定的内存限制。过滤器会自动检测系统上可用的内核和处理器数量,并在执行过程中创建该数量的线程,以及自动将数据分割为通过管线传输的片段。