一、vtk基本架构

Vtk是基于对象的系统,高效使用vtk的关键是深入理解使用的对象模型。这样做可以避免对系统种上百种种对象的错误理解。有了对对象模型的准确理解,将很容易对这些对象进行组合编写自己的应用程序。也需要知道系统中很多对象的能力(特性和方法),要知道这个必须看很多代码示例和在线文档。

Vtk系统两种主要的组成是可视化管线和渲染管线。可视化管线用于获取和产生数据、处理数据、把数据写入文件或传递给渲染引擎用于显示。渲染引擎负责生成数据的可视化表示。

1、渲染引擎

渲染引擎由负责处理可视化引擎的结果并在窗口上显示的类组成。常用主要包括下面的:vtkPop,vtkAbstractMapper,  vtkPropery和vtkVolumeProperty, vtkCamera, vtkLight, vtkRenderer, vtkRenderWindow,vtkRenderWindowInteractor, vtkTransform,vtkLookupTable, vtkColorTransferFunction和vtkPiecewiseFunction等。

场景中存在的数据的可见描述是vtkPop的子类,最常见的子类是用与展示3D对象的vtkActor(用于表示场景中数据的几何特征)和vtkVolume(用于表示场景中的体数据)。也有用于表示2D场中数据的vtkActor2D。vtkPop子类的通用职责是知道自己在场景中的位置、大小、方向。除了对位置的控制,它通常有个投影对象(mapper object)知道如何渲染(render),另外属性对象(property object)控制的参数有颜色和透明度等。

有超过50多种特定的props,比如vtkImageActor(用于展示image)和vtkPieChartActor(用于生成数组数据的饼状图表示)。一些特殊的props直接包括控制外观的参数,或者直接带有要渲染的输入数据的引用,因此这些props不需要设置属性对象(propery object)或投影对象(mapper object)。比如,vtkFollower是一种特殊的vtkActor子类,它能自动更新自己的方向,使得始终面向相机,很适用于在3D空间展示面板和文字。

 

2、可视化引擎

可视化引擎用于读取或生成数据、分析和处理数据、把数据写道文件或传递给渲染引擎进行显示。比如,可以从磁盘读取3D体数据,可以对它进行处理生成一组三角形表示数据体内的等值面,然后把这个几何数据写回磁盘,或者生成一组球体或圆柱体表示原子和棍子,把它们传递给渲染引擎用于显示。

Vtk利用数据流的方法把信息转化为图形数据,在这个过程中有两类基本的对象,分别是vtkDataObject和vtkAlgorithm。

数据对象vtkDataObject表示各类数据。vtkDataObject类通常被视作通用的“blob”数据。有正式结构的数据被称作数据集(vtkDataSet),数据集包括几何数据和拓扑结构(points 和cells),它也有相关的属性数据,包括标量和向量,属性数据可以依附于数据集的几何数据(points)和拓扑结构(cells)。拓扑结构Cells是几何数据点Points的拓扑组织,拓扑结构cells组成了数据集的原子(atoms)用于几何结构点(points)之间的信息插值。Vtk内支持的cell类型有74种,包括线性拓扑结构和非线性拓扑结构。

算法vtkAlgorithm,通常也称为过滤器(filter),用于操作数据对象并产生新大数据对象。算法和数据对象相互连接形成了可视化管线,也成为数据流网络。源算法(Source Algorithm)通过读取(reader objects)或构建(procedural source object)一个或多个数据对象,过滤器(filter)接收一个或多个数据对象并产生一个或多个输出对象。投射器Mapper(一些情况下,是特定的actor)获取filter处理后的数据把它转化一种可视化表示,然后再渲染引擎中显示。写出器(writer)可以理解为一种特殊的映射器(mapper),它把数据传递到文件或数据流。

图像处理(Image Processing).vtk支持大量的图像处理和三维渲染方法。在vtk中2D和3D图像数据(image)都被视作vtkImageData。在vtk中图像数据集(iamge dataset)是一种数据按照规则的、沿着坐标轴排列的矩阵。图像(Image)、像素图(pixmaps)和位图(bitmaps)是2D 图像数据集的例子,体数据(一组2D图像)时3D图像数据,比如三维地震数据。

图像处理的管线通常输入和输出图像数据集。因为数据的规则和简单特性,图像处理管线有一些其它的重要特性。体渲染(Volume Rendering)用于3D vktImageData的可视化,特殊的图像查看器可以查看2D vtkImageData。几乎所有的图像处理管线都是多线程的,可以按照用户给定的内存限制以数据片的形式处理数据。图像处理管线的过滤器能自动感知电脑的核数自动把数据分片利用多线程方式进行读取(vtkStreamingDemandDrivenPipline)。

对象众多,通过示例学习不同对象的特性和方法是很好的方法,如果直接看类的继承关系,很枯燥,而且理解。通过示例学习是必不可少的方法。

 

图形子系统用于显示各种形式的数据,包括多边形数据和体积(即定期采样的数据)。渲染系统由以下关键对象组成,这些关键对象组合到场景中以生成最终的三维显示。

vtkactor和vtkprop-要呈现在场景中的对象。一般来说,我们将这些对象称为“演员”,尽管vtkactor实际上是vtkprop的一个子类(就像在舞台上发现的“道具”)。

  • vtkamera-用于将演员从三维空间投影到二维图像的对象。
  • vtklight-用于照亮场景。
  • VTK属性-用于将材料(即照明)属性应用于演员。
  • vtkrenderer-这是显示渲染图像的对象。
  • vtkrenderwindow-一个或多个渲染器可以组合到渲染窗口中。

这种对象组织与电影/视频制作行业中我们许多人熟悉的“灯光、相机、演员”概念模型是一致的。请注意,许多其他对象都存在于幕后,例如转换矩阵(vtktransform)、交互程序(处理鼠标和键盘事件)和纹理映射(vtktexture)。请注意,在构建表单应用程序时,activiz.net系统将vtkrender和vtkrenderWindow组合为一个称为“renderwindowcontrol”的类。这是在Activiz应用程序中创建并嵌入到.NET程序中的表单。

一个重要的注意事项:vtkrenderWindowInteractor类是用于管理渲染窗口中鼠标和键盘事件的keystone类。通过交互风格(vtKinteratorObserver的子类),可以定制交互行为。默认情况下,交互程序支持以下绑定:

  • 鼠标左键-旋转摄像头
  • 鼠标中键-转换摄像头
  • 鼠标右键-放大/缩小
  • 键按下J键-进入操纵杆模式(鼠标向下键导致连续摄像机运动),退出轨迹球模式
  • 按键T-进入轨迹球模式(鼠标向下加上运动导致相机运动),退出操纵杆模式
  • 按键F-在演员上方按此键(在场景);相机焦点设置为拾取的位置,相机朝该点飞去。
  • 按键W-演员显示在线框中
  • 按键S-演员显示为表面
  • 按键R-重置相机,使所有可见的演员都出现在场景中。

除了这里描述的基本类之外,还有数百个类为VTK系统实现关键功能。这包括用于处理数据的过滤器、用于直接操作数据的交互小部件、图像处理、体积渲染、信息可视化、数学和计算几何(仅举几个例子)。以下示例演示了vtk的各种使用方法,以及如何在.NET框架中使用vtk。

 

VTK程序段落主要包含两个部分。一是数据和管道部分,二是角色和渲染部分。其工作的基本流程是“数据源Souce”--“过滤器Filter”-- “制图器Mapper”-- “角色Actor”--“渲染器Renderer”。 从对象和语言上看,VTK的类和方法实现简介,程序清晰,可读性好,这也是C#的特点。VTK对OpenGL进行了面向对象的封装,并设置了大量简单易用的默认值。