【VTKUsersGuide笔记】第三章-VTK系统概述(架构)

VTK包括两个基础的子系统:一个已编译的C ++类库和一个“解释”包装层,“解释”包装层让你可以使用Java,Tcl和Python这些解释型语言操作已编译的C++类库。如图3-1。
在这里插入图片描述
这种架构的优点是,你可以在编译的C ++语言中构建高效(在CPU和内存中使用)的算法,并保留解释型语言的快速代码开发功能(避免编译/链接循环,简单但功能强大的工具,以及访问GUI工具的接口)。

本节将从高层(high-level)来介绍VTK中的两个主要组件(概念):可视化管线和渲染引擎。可视化管线用于获取或创建数据、处理数据,并将结果写入文件或传递给渲染引擎显示出来。渲染引擎负责创建数据的可视化表示。

1 底层对象模型

VTK对象模型都是超类vtkObject的派生类,几乎所有VTK类都派生自此类,但在某些特殊情况下也会派生自其超类vtkObjectBase。所有VTK类的实例都必须使用其对象的New()方法创建,并且必须使用对象的Delete()方法销毁。VTK对象无法在堆内存上创建,因为其构造函数是受保护的(protected)方法。VTK使用公共超类以及统一的创建和销毁对象的方法,这使得VTK能够提供几个基本的面向对象操作。

1.1 引用计数

VTK对象显式地保存了自身的被引用个数。当一个对象通过静态方法New()被创建时它的引用计数就会被初始化为1,因为必然会有一个原始指针指向这个新的对象:

vtkObjectBase* obj = vtkExampleClass::New();

当其它对于该对象的引用被创建或销毁时,它的引用计数会通过Register()或UnRegister()方法增加或减少。这一般会通过对象的“set”一类方法自动处理:

otherObject->SetExample(obj);

现在它的引用计数就变成了2,因为原始的指针和另外一个对象中存储的指针都指向了它。当不再需要原始指针时,可通过Delete()删除该引用:

obj->Delete();

这时候这个指针就不再拥有对象的引用,也就不能再通过这个指针去访问该对象了。但为了保证有效管理对对象的引用,每次调用New()方法创建对象并使用完成后,都要调用Delete()方法释放内存。

上述手动释放内存的方法较为繁琐,可以通过使用类模板vtkSmartPointer<>提供的智能指针来管理对象,比如上述例子改写为:

vtkSmartPointer<vtkObjectBase> obj = vtkSmartPointer<vtkExampleClass>::New();
otherObject->SetExample(obj);

这样,当智能指针变量超出作用于且不再使用时即可自动释放,不再需要手动调用Delete()方法来释放内存。

1.2 运行时类型信息

VTK中的所有对象都可以通过GetClassName()方法来获取类名标识符,该方法返回一个字符串:

const char* type = obj->GetClassName();

通过IsA()方法可以判断对象的类型,是否为一个类或其子类的实例:

if(obj->IsA("vtkExampleClass")) { ... }

可以通过静态方法SafeDownCast()将父类指针转为子类指针(向下转型)。以下代码只有当对象example是obj的子类实例时才能转型成功,否则返回空指针:

vtkExampleClass* example = vtkExampleClass::SafeDownCast(obj)

1.3 显示对象状态(详细信息)

可以通过对象的Print()方法输出对象的状态(详细信息):

obj->Print(cout);

2 渲染引擎

构成VTK渲染引擎的类主要负责接收可视化管线的输出数据并将其渲染显示到窗口中。以下是相关的一些超类。

2.1 vtkProp

渲染场景中数据的可视化描述是由vtkProp的子类负责的。vtkProp的子类用于确定对象在场景中的位置、大小和方向等信息。其常用的其子类包括:

  • vtkActor:表示几何数据(Geometry Data);
  • vtkVolume:表示体数据(Volumetric Data);
  • vtkAnnotation:表示标注数据(Annotation Data)。

此外,vtkProp还有两个对象:

  • mapper对象:存放数据和渲染信息;
  • property对象:负责控制颜色、不透明度等参数,一般会由对象自动创建。

VTK中定义了大量用于控制特定数据的细化的prop(超过50个)。如vtkImageActor、vtkPieChartActor等

2.2 vtkAbstractMapper

用于存放对输入数据(渲染对象)的引用及相关渲染功能。如常见的mapper:

  • vtkPolyDataMapper:用于渲染多边形几何数据
  • vtkFixedPointVolumeRayCastMapper:用于vtkImageData数据的体渲染;
  • 等等。

2.3 vtkProperty和vtkVolumeProperty

采用单独的属性对象来存放控制渲染效果的参数,这样的好处是可以实现渲染参数的共享。

  • vtkProperty:可用于存储颜色、不透明度、材质的环境光(ambient)系数、散射光(diffuse)系数和反射光(specular)系数等参数;
  • vtkVolumeProperty:用于存储对象的体绘制参数,如颜色和不透明度传递函数等。

2.4 vtkCamera

存储了场景的摄像机参数,包括相机的位置、焦点、向上方向、投影方式(平行投影or透视投影)、视场角及远近裁减平面等。一般会由vtkRenderer自动创建。

2.5 vtkLight

用于计算渲染场景中的光照参数,如光源的方向、颜色及强度等。以及其相对于相机的运动等接口(随相机运动or固定位置)。一般会由vtkRenderer自动创建。

2.6 vtkRenderer

vtkRenderer负责场景的渲染过程,上述对象都会被集中在vtkRenderer对象中。一个渲染窗口(vtkRenderWindow)可以有多个vtkRenderer对象,并可以渲染在窗口的不同区域(可相互覆盖)。

2.7 vtkRenderWindow

负责连接操作系统与VTK的渲染管线。包含一个或多个vtkRenderer对象。

2.8 vtkRenderWindowInteractor

负责监听鼠标、键盘和定时器事件,并通过VTK中的命令/观察者模式做出响应。

2.9 vtkTransform

用于描述对象在三维空间中的变换,本质上是一个4x4的齐次矩阵。

2.10 vtkLookupTable,vtkColorTransferFunction和vtkPiecewiseFunction

用于标量数据可视化过程中,标量数据到颜色和不透明度的映射。

  • vtkLookupTable::用于几何数据渲染;
  • vtkColorTransferFunction和vtkPiecewiseFunction:用于数据体绘制。

2.11 一个简单的例子(利用上述对象来渲染场景)

vtkCylinderSource *cylinder = vtkCylinderSource::New();
vtkPolyDataMapper *cylinderMapper = vtkPolyDataMapper::New();
cylinderMapper->SetInputConnection(cylinder->GetOutputPort());
vtkActor *cylinderActor = vtkActor::New();
cylinderActor->SetMapper(cylinderMapper);
vtkRenderer *ren1 = vtkRenderer::New();
ren1->AddActor(cylinderActor);
vtkRenderWindow *renWin = vtkRenderWindow::New();
renWin->AddRenderer(ren1);
vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
iren->SetRenderWindow(renWin);
renWin->Render()
iren->Start();

3 渲染管线

VTK可视化管线负责读取或生成数据,主要涉及两种基本数据类型:

  • vtkDataObject:一般类型的数据。有规则结构的数据用vtkDataSet表示,图3-2显示了VTK中支持的vtkDataSet类型(子类)。包含了几何结构(顶点)和拓扑结构(顶点之间的连接关系),另外还有属性数据(标量或向量数据),如图3-3。
    在这里插入图片描述
    在这里插入图片描述
  • vtkAlgorithm:又被称为滤波器/过滤器(Filter),用于处理输入数据并产生新的数据对象。图3-4描述了一个可视化管线。
    在这里插入图片描述
    图3-4和图3-5说明了可视化管线中的一些概念。通过读取(Reader)或创建数据对象产生源数据并传入Filter进行处理,Filter可接收一个或多个数据并产生一个或多个数据输出。Mapper接收传入的数据并将其转换为可被渲染引擎绘制的数据,特殊的,Writer可以看作是将数据写入文件或者数据流的Mapper。
    在这里插入图片描述
    VTK中可视化管线的构建有几个关键点:
  • VTK中通过Filter的SetInputData-GetOutput或SetInputConnection-GetOutputPort方法进行连接。如:
    aFilter->SetInputData(anotherFilter->GetOutput());
    aFilter->SetInputConnection(anotherFilter->GetOutputPort());
  • VTK中采用“惰性求值方案”(Lazy Evaluation Scheme),即只有在需要数据的时候才进行计算,这是通过每个对象内部记录的修改时间(Modification Time)实现的。
  • 管线的连接中,要求anotherFilter的输出对象与aFilter的输入对象类型相互兼容(如父子关系)。

3.1 管线的执行

如前面所说,VTK中采用Lazy Evaluation方案,因此考虑如下例子:

vtkSphereSource *sphere = vtkSphereSource::New();
sphere->SetRadius(10);
std::cout<<sphere->GetNumberOfPoints()<<std::endl;

上述代码中GetNumberOfPoints()函数的返回值为“0”,但但我们在输出前调用其Update()方法后即可输出正确的点个数:

vtkSphereSource *sphere = vtkSphereSource::New();
sphere->SetRadius(10);
sphere->Update();
std::cout<<sphere->GetNumberOfPoints()<<std::endl;

但通常在一个已经构建好的渲染管线中,当位于管线末端的对象Actor接收到(来自Renderer)的Render()渲染请求后,会将该请求沿着管线向上游回溯(请求数据),最终,整条管线被执行。如图3-6所示:
在这里插入图片描述

3.2 图像处理

VTK支持大量的图像处理和体绘制功能,包括二维图像和三维图像(volume),它们都可以被看作vtkImageData。

4 VTK中的设计模式

VTK中采用命令/观察者模式来设计实现回调函数(Callback,又称为用户方法/UserMethod/回调函数)。VTK中几乎所有类均可通过SetObserver()方法创建回调函数。观察者(Observer)通过监听对象中相应的激活事件,当事件被激活时执行相应的命令(Command)并调用回调函数(Callback)。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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、付费专栏及课程。

余额充值