第03章-VTK系统概述(2)

【译者:这个系列教程是以Kitware公司出版的《VTK User’s Guide -11th edition》一书作的中文翻译(出版时间2010年,ISBN: 978-1-930934-23-8),由于时间关系,我们不能保证每周都能更新本书内容,但尽量做到一周更新一篇到两篇内容。敬请期待^_^。欢迎转载,另请转载时注明本文出处,谢谢合作!同时,由于译者水平有限,出错之处在所难免,欢迎指出订正!】


【本节对应原书中的第25页至第29页】

可视化管线

VTK可视化管线主要负责读取或者生成数据,分析或生成数据的衍生版本,写入硬盘文件或者传递数据到渲染引擎进行显示。例如,你可能从硬盘中读取一个3D体数据,经过处理生成体数据中一个等值面的三角面片的表示数据,然后将该几何数据写回到硬盘中。或者你可能创建了一些球体和圆柱用来表示原子和原子间的联系,然后传递到渲染引擎中显示。

VTK中采用数据流的方法将信息转换为几何数据。主要涉及到两种基本的对象类型。

l  vtkDataObject

l  vtkAlgorithm

数据对象表示了不同类型的数据。vtkDataObject可以看做一般的数据集合。有规则结构的数据称为一个Dataset(数据集,vtkDataSet类)。图3-2显示了VTK中支持的DataSet对象。如图所示Dataset中包含几何结构和拓扑结构数据(点和Cell单元);另外还有相应的属性数据,如标量或者向量数据。Dataset中的属性数据既可以关联到点,也可以关联到单元上。单元是点的拓扑组合,是构成Dataset结构的基本单位,常用来进行插值计算。图19-20和图19-21显示了VTK中支持的23种最常用单元类型。图3-3显示了VTK支持的属性数据。


图3-2 VTK中的数据集类型。注意无结构点集(Unstructured Points)可以用多边形数据(Polygonal Data)或者无结构网格(Unstructured Grids)表示,因此VTK中没有该数据结构类型。


图3-3与数据集里的点和单元数据相关联的属性数据


图3-4数据对象用算法(过滤器)连接形成可视化管线,图中箭头表示数据流动方向。

算法(Algorithms)常被称为过滤器(Filter),处理输入数据并产生新的数据对象。可视化管线是由算法和数据对象连接而成(例如,数据流网络)。图3-4描述了一个可视化管线。

图3-4和3-5中说明了一些重要的可视化概念。源算法通过读取(Reader对象)或者创建数据对象(程序源对象)两种方式来产生数据。一个或者多个数据对象传入过滤器后,经过处理产生新的数据对象。Mappers(或者特殊情况下专门的Actors)接收数据并将其转换为可被渲染引擎绘制的可视化表达。Writer也可以看做是将数据写入文件或者流的Mapper类型。


图3-5不同类型的算法,Filter可以处理一个或多个输入数据对象,并产生一个或多个输出。

接下来主要介绍可视化管线构建相关的几个重要问题。首先,可视化管线通过如下函数或者其变形来连接构建的:

aFilter->SetInputConnection(anotherFilter->GetOutputPort() );

该函数将anotherFilter的输出作为aFilter的输入(有多个输入输出的Filters也有类似的方法)。第二,我们需要一种机制来控制管线的执行。我们只想执行管线中必要的部分来产生最新的输出。VTK采用了一种“惰性计算策略”(Lazy Evaluation Scheme)——只有需要数据的时候才进行计算,该机制是基于每个对象的内部修改时间(Modification Time)来实现的。

第三,管线的装配要求只有相互兼容的对象才能组装,使用的接口是SetInputConnection()和GetOutputPort()函数。如果运行时数据对象不兼容,则会产生错误。最后,当管线执行后,我们必须决定是否缓存或者保留数据对象。这对于一个成功的可视化工具应用程序来说十分重要,因此可视化数据集会非常的大。VTK提供了打开或者关闭缓存的方法,利用引用计数来避免数据拷贝,以及流数据分片方法来处理内存不能一次性容纳整个数据集的情况。(我们推荐您阅读《The VisualizationToolkit An Object-Oriented Approach to 3D Graphics》一书中VisualizationPipeline章节来获取更多相关信息。)

注意,算法(Algorithm)和数据对象(DataObject)都有许多不同的类型。图16-2中列出了当前版本VTK支持的最常用的数据对象类型。算法随着输入数据类型、输出数据类型的变化而变化,当然还有特定的算法实现。

管线的执行

前面章节我们讨论了管线执行控制的必要性。接下来,我们深入理解一些关于管线执行的重要概念。

如前所讲,VTK可视化管线只有当计算需要时才会执行(Lazy Evaluation 惰性计算)。思考一下下面的例子,该例子中我们初始化一个reader对象并且查询对象中点的个数。(示例采用Tcl语言编写)

vtkPlot3DReader reader
   reader SetXYZFileName$VTK_DATA_ROOT/Data/combxyz.bin
   [ reader GetOutput ] GetNumberOfPoints

即便数据文件中有上千个点,GetNumberOfPoints()函数返回为”0”。但是,当你添加Update()方法后,即:

readerUpdate
[reader GetOutput ] GetNumberOfPoints

 

函数会返回正确的点个数。前面例子中GetNumberOfPoints()并没有要求计算,因此返回当前的点个数:0。而在第二个例子中,Update()函数驱动管线执行,从而驱动reader执行,读取数据文件中的数据。一旦reader执行后,点的个数就被正确的赋值。

通常情况下,你不必手动调用Update()函数,因为filter在可视化管线中是连接在一起的。当Actor接收到渲染自己的请求(即Render())后,它将向前传递Update()方法至相应的Mapper,Update()方法通过管线自动发出。图3-6显示了一个高层的可视化管线的执行流程。如图所示,Render()发出数据请求,通过管线向上传递。对于管线中已经过期的环境,filters会重新执行,从而得到最新的终端数据,并被Actor绘制。(详细的执行过程信息,请参考第15章ManagingPipeline Execution,第317页)


图3-6管线执行的概观

图像处理

VTK支持大量的图像处理和体绘制功能。VTK中无论是2D(图像)还是3D(volume,体)数据都可以看做为vtkImageData。一个图像数据集是一个沿坐标轴规则排列的数据数组;Volume(二维图像集合)是三维的图像数据集。

图像处理管线中算法的输入和输出通常为图像数据对象。由于图像数据简单而且规则的性质,图像处理管线还有一些其他的重要特征。体绘制算法用来可视化三维vtkImageData(参考139页“体绘制”一章),另外一些专门的图像Viewer【译者:如vtkImageViewer2等类】则是用来浏览二维vtkImageData。图像处理管线中几乎所有的算法都是多线程的,而且采用分片处理流数据以适应用户内存大小限制。运行时,Filter能够自动获取系统中处理器和核的个数,并创建相应的线程,同时,自动将数据进行分片。(参考325页“vtkStreamingDemandDrivenPipeline”)

以上是对VTK系统结构的总体概述。更多VTK中算法的详细细节请参阅《The Visualization Toolkit AnObject-Oriented Approach to 3D Graphics》一书。学习VTK中示例程序也是学习VTK的一个好方法。第4章到13章中包含了许多的示例程序来说明VTK的主要功能。另外,因为VTK代码是开源的,你也可以学习VTK源码目录中VTK/Examples中的例子。

通过以上简略的介绍之后,下面来看一下如何用C++,Tcl,Java,和Python来创建应用程序。


  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值