文章

VTK 笔记

VTK可视化基本流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/* 二维等值线提取与可视化代码片段 */
// 等值线 Filter
vtkContourFilter *contourFilter = vtkContourFilter::New();
contourFilter->SetValue(0, ui->selectedValueLabel->text().toDouble());
contourFilter->SetInputData(polyData);

// 将几何数据转换为可被渲染引擎绘制的可视化表达
vtkPolyDataMapper *contourMapper = vtkPolyDataMapper::New();
contourMapper->SetInputConnection(contourFilter->GetOutputPort());
contourMapper->ScalarVisibilityOff();

// 需要被渲染绘制的对象
contourActor = vtkActor::New();
contourActor->SetMapper(contourMapper);
contourActor->GetProperty()->SetColor(1.0, 0.0, 0.0);
contourActor->GetProperty()->SetLineWidth(2.0);

// 添加到渲染器
renderer->AddActor(contourActor);

VTK可视化基本流程

VTK 主要 class

VTK开发精要:数据与管线机制(济南友泉软件有限公司)

Filter

VTK中通过管线机制来实现组合各种算法处理数据。每一种算法是一个Filter,多个Filter连接在一起形成VTK管线

$\color{#FF0000}{每个Filter可以分为两个组成部分:一个是算法对象,继承自vtkAlgrithm,主要负责处理输入的数据和信息;另一个是执行对象,继承自vtkExecute(),负责通知算法对象何时运行以及传递需要处理的数据和信息。}$

Filter类继承自vtkAlgrithm及其子类,实例化时,内部会生成一个默认的Executive()对象,用于管理执行管线。

Filter的输入数据与信息存储在输入端口中。一个Filter可能有0个输入端口(例如 Reader 对象);也可能有一个或多个输入端口(例如,vtkGlyph3D 类需要两个输入端口,每个输入端口可以建立多个连接)。

一个Filter可能有1个或多个输出端口,每个输出端口对应一个逻辑输出。例如vtkExtractVectorComponents类,从一个三维向量数据中提取每个分量数据,该Filter需要一个输入端口接受向量数据,三个输出端口用于输出三个分量数据,端口号分别为 0, 1, 2。

Filter之间通过端口(Port)建立连接(Connection)。例如一个标准的连接代码如下:

1
Filter2->SetInputConnection( Filter1->GetOutputPort() );

该句代码将Filter1的输出端口与Filter2的输入端口建立连接,连接中只涉及了一个输入端口和一个输出端口。

VTK中还有许多Filter可能需要多个输入,例如vtkGlyph3D,该类需要两个输入数据并生成一个输出数据。因此这里需要建立两个连接,相应的函数分别为SetInputConnection()SetSourceConnection(),其中,SetInputConnection()输入的是几何点集数据,对应输入端口0,SetSourceConnection()输入的是Glyph图形数据,对应输入端口1。vtkGlyph3D中输入的两个数据具有不同的意义,因此建立了两个不同的输入端口。

另外,对一个Filter的多个输入数据具有相同意义时,则只需要建立一个输入端口,并使用AddInputConnection()来添加新的连接。例如vtkAppendFilter类实现数据的合并,其多个输入数据具有相同意义,而不像vtkGlyph3D的两个输入表示不同的对象,因此其连接建立如下:

1
2
3
apeend = vtkAppendFilter::New();
append->AddInputConnection( foo->GetOutputPort );
append->AddInputConnection( bar->GetOutputPort );

管线的接口是通过逻辑端口(Logical Port)而不是数据流实现的,因此在形成连接的过程中不需要知道实际的数据类型,而是在执行时进行数据类型检查,以决定管线是否执行。

本文由作者按照 CC BY 4.0 进行授权