VTK User’s Guide -11th edition 第03章-VTK系统概述(2)

【本节对应原书中的第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语言编写)

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

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

  1. readerUpdate  
  2. [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来创建应用程序。

VTK用户指南 版本4.0 William J. Schroeder 1998-2000 第一部分 VTK 介绍 第1 欢迎 机构-----------------------------------------------------------------------------------------------8 怎样使用VTK----------------------------------------------------------------------------------8 附加资源-----------------------------------------------------------------------------------------8 第2 安装 2.1 概述-----------------------------------------------------------------------------------------------9 2.2 安装VTK到Windows9x/NT/ME/2000/XP------------------------------------------------9 二进制安装-------------------------------------------------------------------------------------9 源代码安装-------------------------------------------------------------------------------------9 2.3 安装VTK到Unix操作系统 源代码安装------------------------------------------------------------------------------------10 运行CMake------------------------------------------------------------------------------------11 编译源代码 建立VTK多平台 安装VTK 第3 系统概述 3.1 系统设计---------------------------------------------------------------------------------------12 图形模型--------------------------------------------------------------------------------------13 可视化模型-----------------------------------------------------------------------------------15 3.2 创建一个应用---------------------------------------------------------------------------------19 用户方法、对象和命令--------------------------------------------------------------------19 Tcl----------------------------------------------------------------------------------------------19 C++---------------------------------------------------------------------------------------------20 Java Phthon Visual Basic/COM/ActiveX 3.3 在两种语言间转换 第二部分 通过例子学习VTK 第4 基础 4.1 创建1个简单的模型-------------------------------------------------------------------------24 程序化源对象---------------------------------------------------------------------------------24 读取源对象------------------------------------------------------------------------------------26 4.2 使用VTK交互器-----------------------------------------------------------------------------27 vtk绘制窗口交互器 交互风格 4.3 滤波数据---------------------------------------------------------------------------------------29 4.4 控制相机---------------------------------------------------------------------------------------30 安装相机 简单操作方法 控制视角方向 透视与正交视 保存与恢复相机状态 4.5 控制光线---------------------------------------------------------------------------------------32 位置光 4.6 控制3D道具-----------------------------------------------------------------------------------32 指定vtk道具3D位置 演员 演员的详细级 装配 体 vtk装载3D道具 4.7 作用纹理---------------------------------------------------------------------------------------37 4.8 拾取---------------------------------------------------------------------------------------------38 vtk装配路线 例子 4.9 vtk坐标和坐标系---------------------------------------------------------------------------40 4.10 控制vtk演员2D----------------------------------------------------------------------------41 4.11 注释--------------------------------------------------------------------------------------------41 2D注释 3D注释和vtk跟踪 4.12 特殊绘图类-----------------------------------------------------------------------------------44 尺度棒 X-Y绘制 边界盒轴 标记数据 4.13 变换数据--------------------------------------------------------------------------------------48 高级变换 第5 可视化技术 5.1 可视化VTK数据集vtkDataSet(和子类) -------------------------------------------------50 使用数据属性进行工作 颜色映射 轮廓化 浮雕化 流线图 流线表面 剪裁 融合数据 附加数据 用另外一个尺度给等值面赋颜色 抽取单元格子集 抽取单元格作为多边形数据 5.2 可视化多边形数据---------------------------------------------------------------------------67 手工产生多边形数据 产生表面当量 十比一抽取 平滑网格 粘贴数据 产生纹理坐标 5.3 可视化结构网格-----------------------------------------------------------------------------74 手工产生结构化网格 抽取计算平面 结构网格子样化 5.4 可视化直线网格-----------------------------------------------------------------------------76 手工产生VTK直线网格 抽取计算平面 5.5 可视化非结构网格--------------------------------------------------------------------------77 手工产生VTK非结构网格 抽取部分网格 非结构网格轮廓化 第6 可视化图像和体数据 6.1 VTK结构化点的历史表示-----------------------------------------------------------------80 6.2 手工产生VTK图像数据-------------------------------------------------------------------80 6.3 抽取图像数据子样--------------------------------------------------------------------------81 6.4 基于尺度值的弯曲--------------------------------------------------------------------------83 6.5 图像显示--------------------------------------------------------------------------------------83 图像观察者 图像演员 6.6 图像源-----------------------------------------------------------------------------------------85 2D帆布图像源 3D椭圆体图像源 高斯图像源 网格图像源 噪声图像源 正弦曲线源 6.7 图像处理--------------------------------------------------------------------------------------88 梯度化 高斯平滑 直方图 图像逻辑 重新切片 6.8 体绘制-----------------------------------------------------------------------------------------92 一个简单的例子 为什么会有多种体绘制技术? 产生一个VTK体 使用片层化函数 使用颜色变换函数 在一个体属性中控制颜色和透明度 在一个体属性中控制阴影 产生一个体映射 裁剪一个体 粘贴一个体 对一个体应用3D纹理 控制标准编码 体素光线计算 2D纹理映射 VolumePro绘制硬件 速度和精确度交替使用 使用vtkLODProp3D改善性能 可行性/局限性技术 第7 建立模型 7.1 隐模型----------------------------------------------------------------------------------------114 定义隐函数 对隐函数进行抽样 7.2 挤压-------------------------------------------------------------------------------------------117 7.3 构建表面-------------------------------------------------------------------------------------119 Delaunay三角形化 高斯油彩 无组织点产生表面 第三部分 VTK研发者指南 第8 数据接口和其他 8.1 读入器----------------------------------------------------------------------------------------130 多边形数据读入器 图像和体素读入器 数据集读入器 结构化网格读入器 线性网格读入器 非结构化网格读入器 8.2 写入器----------------------------------------------------------------------------------------131 多边形数据读入器 图像和体素读入器 结构化网格读入器 线性网格读入器 非结构化网格读入器 8.3 输入者----------------------------------------------------------------------------------------132 8.4 输出者----------------------------------------------------------------------------------------132 8.5 创建硬拷贝----------------------------------------------------------------------------------132 保存图像 保存大(高分辨率)图像 8.6 产生动画(使用样条) -----------------------------------------------------------------------134 8.7 使用现场数据工作--------------------------------------------------------------------------136 第9 贡献编码 9.1 编码补偿--------------------------------------------------------------------------------------141 为VTK贡献编码的条件 编码风格 如何贡献编码 9.2 标准方法: 创建和消除对象---------------------------------------------------------------142 9.3 拷贝对象和受保护的方法------------------------------------------------------------------143 9.4 写一个VTK类: 综述-----------------------------------------------------------------------144 找到一个相似类 识别一个超类 单个类Per.h 文件 必需的方法 文档编码 使用SetGet宏 向VTK中添加类 9.5 对象工厂--------------------------------------------------------------------------------------145 综述 如何写一个工厂 如何安装一个工厂 例子工厂 第10 流水线执行管理 10.1 执行过程--------------------------------------------------------------------------------------151 概述和术语 更新信息通道 传播更新扩展通道 触发异步更新通道 更新数据通道 10.2 使用流---------------------------------------------------------------------------------------162 第11 VTK数据对象接口 11.1 数据组---------------------------------------------------------------------------------------166 方法 11.2 数据集---------------------------------------------------------------------------------------169 11.3 VTK数据集接口---------------------------------------------------------------------------170 方法 例子 11.4 VTK图像数据接口-----------------------------------------------------------------------174 方法 例子 11.5 VTK点集接口-----------------------------------------------------------------------------176 方法 例子 11.6 VTK结构化网格接口---------------------------------------------------------------------178 方法 例子 11.7 VTK线性网格接口-----------------------------------------------------------------------178 方法 例子 11.8 VTK多边形数据接口---------------------------------------------------------------------179 方法 例子 11.9 VTK非结构化网格接口-----------------------------------------------------------------184 方法 例子 11.10 单元格接口(VTK单元格子类) ------------------------------------------------------185 11.11 其他接口----------------------------------------------------------------------------------187 点 单元格数组 单元格类型 单元格连接 11.12 现场和属性数据接口------------------------------------------------------------------193 现场数据方法 数据集属性方法 第12 如何写一个过程方法 12.1 概述----------------------------------------------------------------------------------------196 永远不要修改输入数据 参考计数数据 使用Debug宏 回收/删除截入的内在 修改时间 过程事件和异常终止执行 12.2 如何写一个绘图过滤器---------------------------------------------------------------199 概述 简单过滤器 复杂过滤器和流水线执行 抽取绘图过滤器 程序过滤器 重载流水执行方法 12.3 如何写一个图像过滤器---------------------------------------------------------------210 实现一个图像过滤器 第13 用窗口系统集成 13.1 绘制窗口交互风格--------------------------------------------------------------------------216 13.2 GUI交互的总指导线------------------------------------------------------------------------217 13.3 X Window, Xt, and Motif--------------------------------------------------------------------221 13.4 MS Windows/Microsoft Foundation Classes---------------------------------------------226 13.5 Tcl/Tk-------------------------------------------------------------------------------------------227 13.6 Java 第14 编码资源 14.1 对象图表--------------------------------------------------------------------------------------230 基础 单元格 数据集 流水线 源 过滤器 映射器 图形 体绘制 成像 OpenGL绘制器 拾取 变换塔形结构 14.2 过滤器总结-----------------------------------------------------------------------------------237 可视化过滤器 映射者对象 演员对象 14.3 VTK文件格式--------------------------------------------------------------------------------244 二进制文件 数据集属性格式 例子 第15 光盘 15.1 源代码 15.2 例子代码 15.3 Window 9x/NT/ME/2000/XP 预编译二进制 15.4 数据 15.5 文档 15.6 退化测试图像 15.7 Kitware 应用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值