4.2 可视化管线
我们回头再看看3.1的示例RenderCylinder。在这个例子及后续的扩展内容里,我们可以找到以下列出的类或其子类:
vtkProp; vtkAbstractMapper;vtkProperty; vtkCamera; vtkLight; vtkRenderer; vtkRenderWindow;vtkRenderWindowInteractor; vtkTransform; vtkLookupTable ……
我们发现,这些类都是与数据显示或者说渲染相关的。用一个专业的词汇来说,它们构成了VTK的渲染引擎(Rendering Engine)。渲染引擎主要负责数据的可视化表达,它是VTK里的两个重要模块之一,另外一个重要的模块就是可视化管线(Visualization Pipeline)。
可视化管线是指用于获取或创建数据,处理数据,以及把数据写入文件或者把数据传递给渲染引擎进行显示,这样的一种结构在VTK里就称之为可视化管线。数据对象(Data Object)、处理对象(Process Object)和数据流方向(Direction of Data Flow)是可视化管线的三个基本要素。每个VTK程序都会有可视化管线存在,比如示例RenderCylinder,其可视化管线可以简单地表示成图4.8。
图4.8 示例RenderCylinder的可视化管线
示例RenderCylinder的可视化管线非常简单,首先是创建一个锥体数据,接着经Mapper后生成的多边形数据(vtkPolyData)直接送入渲染引擎渲染,创建的数据没有经过任何处理。
我们再看一个稍微复杂点的可视化管线(示例4.2.1_vtkPipelineDemo),在这个示例里,我们先读入后缀为vtk的文件(head.vtk),然后用移动立方体法(vtkMarchingCubes)提取等值面,最后把等值面数据经Mapper送往渲染引擎进行显示,示例完整代码如下,运行结果如图4.9左所示,右边是其可视化管线。
///vtkPipelineDemo.cpp
1: #include "vtkSmartPointer.h"
2: #include "vtkStructuredPointsReader.h"
3: #include "vtkRenderer.h"
4: #include "vtkRenderWindow.h"
5: #include "vtkRenderWindowInteractor.h"
6: #include "vtkMarchingCubes.h"
7: #include "vtkPolyDataMapper.h"
8: #include "vtkActor.h"
9:
10: int main(int argc, char *argv[])
11: {
12: //读入Structured_Points类型的vtk文件。
13: vtkSmartPointer<vtkStructuredPointsReader> reader =
14: vtkSmartPointer<vtkStructuredPointsReader>::New();
15: reader->SetFileName("../head.vtk");
16:
17: //用移动立方体法提取等值面。
18: vtkSmartPointer<vtkMarchingCubes> marchingCubes =
19: vtkSmartPointer<vtkMarchingCubes>::New();
20: marchingCubes->SetInputConnection(reader->GetOutputPort());
21: marchingCubes->SetValue(0,500);
22:
23: //将生成的等值面数据进行Mapper
24: vtkSmartPointer<vtkPolyDat