《VTK图形图像开发进阶》第1-2章——一个稍微复杂的VTK程序
VTK概览
数据可视化主要是通过计算机图形学的方法,以图形、图像等形式清晰有效地传递、表达信息,VTK是数据可视化的工具包。
VTK全称(Visualization Toolkit),即可视化工具包,是一个开源、跨平台、可自由获取、支持并行处理图形应用函数库。
三维计算机图形、图形处理及可视化是VTK主要的应用方向。通过VTK可以根据许多学科(如建筑学、气象学、医学、生物学或者航空航天学)中的实验数据,进行逼真的体、面、光源等渲染,从而帮助人们理解那些采取错综复杂的、规模庞大的数字呈现形式的科学概念或结果。
VTK包含一个C++类库,众多的编程预约接口层,包括Tcl/Tk、Java、Python。VTK是在三维函数库OpenGL的基础上采用面向对象的设计方法发展起来的,它将可视化开发过程中会经常遇到的细节屏蔽起来,并封装了一些常用算法,比如,VTK将表面重建中比较常见的Marching Cubes算法封装起来,以类的形式供用户使用,这样在对三维规则点阵数据进行表面重建时就不必重复编写Marching Cubes算法的代码,只需直接使用VTK中已经提供的vtkMarchingCubes类即可。
VTK为从事可视化应用程序开发工作的研究人员提供技术支持,是一个强大的可视化开发工具。它具有如下特点。
1) VTK具有强大的三维图形功能。VTK既支持基于体素的体绘制(Voxel-Based Volume Rendering),又保留了传统的面绘制(surface Rendering),从而在极大地改善可视化效果的同时又可以充分利用现有的图形库和图形硬件。
2) VTK的体系结构使其具有非常好的流(Streaming)和高速缓存(Caching)的能力,在处理大量的数据时不必考虑内存资源的限制。
3) VTK能够更好地支持基于网络的工具,比如Java和VRML。随着Web和Internet技术的发展,VTK有着很好的发展前景。
4) VTK能够支持多种着色语言,如OpenGL等。
5) VTK具有设备无关性,这使得其代码具有良好的可移植性。
6) VTK中定义了无多宏,这些宏极大地简化了编程工作并且加强了一致的对象行为。
7) VTK具有丰富的数据类型,支持对多种数据类型进行处理。
8) VTK的跨平台特性方便了各类客户。
示例2.1_RenderCylinder
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkRenderingFreeType);
VTK_MODULE_INIT(vtkInteractionStyle);
#include <vtkSmartPointer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkCylinderSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkProperty.h>
int main()
{
// vtkCylinderSource类派生自vtkPolyDataAlgorithm。生成vtkPolyData数据类型,主要生成一个中心在渲染场景原点的柱体,柱体长轴沿着Y轴,柱体的高度、截面半径等都可以任意指定。
vtkSmartPointer<vtkCylinderSource> cylinder =
vtkSmartPointer<vtkCylinderSource>::New();
cylinder->SetHeight( 3.0 ); //设置柱体的高
cylinder->SetRadius( 1.0 ); //设置柱体横截面的半径
cylinder->SetResolution( 10 ); //设置柱体横截面的等边多边形的边数。
// vtkPolyDataMapper类用于渲染多边形几何数据(vtkPolyData),派生类自vtkMapper,将输入的数据转换为几何图元(点、线、多边形)进行渲染。
vtkSmartPointer<vtkPolyDataMapper> cylinderMapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
// vtkPolyDataMapper::SetInputConnection():VTK可视化管线的输入数据接口,对应的可视化管线的输出数据接口为GetOutputPort(); VTK 5.0之前的版本使用SetInput()和GetOutput()作为输入输出接口,VTK5.X版本保留了对这两个接口的支持。
cylinderMapper->SetInputConnection( cylinder->GetOutputPort() );
// vtkActor类派生自vtkProp类,渲染场景中数据的可视化表达通过vtkProp的子类负责。比如该示例要渲染一个柱体,柱体的数据类型的vtkPolyData,数据要在场景中渲染时,不是直接把数据加入渲染场景,而是vtkProp的形式存在于渲染场景中。
// 三维空间中渲染对象最常用的vtkProp子类有vtkActor(表达场景中的几何数据)和vtkVolume(表达场景中的体数据);二维空间中的数据则是用vtkActor2D表达:vtkProp子类负责确定渲染场景中对象的位置、大小和方向等信息;Prop依赖于两个对象:一个是Mapper(vtkMapper)对象,负责存放数据和渲染信息;另一个是属性(vtkProperty)对象,负责控制颜色、不透明度等参数。另外vtkActor中还可以设置纹理(vtkTexture)对象,用于纹理贴图。
// VTK定义了大量的Prop类,如vtkImageActor(负责图像显示)和vtkPieChartActor(用于创建数组数据的饼图可视化表达形式)。其中有些Prop内部直接包括了控制显示的参数和待渲染数据的索引,因此不需要额外的Property和Mapper对象,例如vtkAxisActor。vtkActor的子类vtkFollower可以自动更新方向信息使其始终面向一个特定的相机,这样无论怎样旋转该对象都是可见的,例如三维场景中的广告板或者文本。
// vtkActor的子类vtkLODActor可以自动改变自身的几何表达形式来实现所需的交互帧率。vtkAssembly建立了各个Actor的层次结构以便在整个结构平移、旋转或缩放等变换时能够更合理地进行控制。
// vtkActor::SetMapper():该方法用于设置生成几何图元的Mapper,即连接一个Actor到可视化管线的末端(Mapper是可视化管线的末端)。
vtkSmartPointer<vtkActor> cylinderActor =
vtkSmartPointer<vtkActor>::New();
cylinderActor->SetMapper( cylinderMapper );
cylinderActor->GetProperty()->SetColor(1.0, 0.0, 0.0);
// vtkRenderer 负责管理场景的渲染过程。组成场景的对象包括Prop,照相机(vtkCamera)和光照(vtkLight)都被整合到一个vtkRenderer对象中。一个vtkRenderWindow中可以有多个vtkRenderer对象,而这些vtkRenderer可以渲染在窗口不同的矩形区域中(即视口)或者覆盖整个窗口区域。
vtkSmartPointer<vtkRenderer> renderer =
vtkSmartPointer<vtkRenderer>::New();
renderer->AddActor( cylinderActor ); // 该方法用于将vtkProp类型的对象添加到渲染场景中
// vtkRenderer::SetBackground():该方法是从vtkRenderer的父类vtkViewport继承的,用于设置渲染场景的背景颜色,用R、G、B的格式设置,三个分量的取值为0.0~1.0。(0.0,0.0,0.0)为黑色,(1.0,1.0,1.0)为白色。除了可以设置单一的颜色之外,还可以设置渐变的背景颜色,vtkViewport::SetBackground2()用于设置渐变的另外一种颜色,但是要使背景颜色渐变生效或者关闭,必须调用以下的方法。
// vtk::Viewport::SetGradientBackground(bool):参数为0时,关闭,反之打开。
// vtk::Viewport::SetGradientBackgroundOn():该方法用于打开背景颜色渐变效果,相当于调用方法vtk::Viewport::SetGradientBackground(1)。
// vtk::Viewport::SetGradientBackgroundOff():该方法用于打开背景颜色渐变效果,相当于调用方法vtk::Viewport::SetGradientBackground(0)。
renderer->SetBackground( 1.0, 1.0, 1.0 );
// 将操作系统与VTK渲染引擎连接到一起。不同平台下的vtkRenderWindow子类负责管理本地计算机系统中窗口创建和渲染过程。当使用VTK开发应用程序时,只需要使用平台无关的vtkRenderWindow类,运行时,系统会自动替换为平台相关的vtkRenderWindow子类。、
// 比如,Windows下运行上述的VTK程序,实际创建的是vtkWin32OpenGLRenderWindow (vtkRenderWindow的子类)对象。vtkRenderWindow中包含了vtkRender集合、渲染参数,如立体显示(Stereo)、反走样、运动模糊(Motion Blur)和焦点深度(Focal Depth)等。
vtkSmartPointer<vtkRenderWindow> renWin =
vtkSmartPointer<vtkRenderWindow>::New();
renWin->AddRenderer( renderer ); // 该方法用于加入vtkRenderer对象
renWin->SetSize( 640, 480 ); // 该方法是从vtkRenderWindow的父类vtkWindow继承过来的,用于设置窗口的大小,以像素为单位。
renWin->Render();
renWin->SetWindowName("RenderCylinder");
// vtkRenderWindowInteractor类提供平台独立的响应鼠标、键盘和时钟事件的交互机制,通过VTK的观察者/命令模式将监听到的特定平台的鼠标、键盘和时钟事件交由vtkInteractorObserver或其子类,如vtkInteractorStyle进行处理。vtkInteractorStyle等监听这些消息并进行处理以完成旋转、拉伸和缩放等运动控制。
// vtkRenderWindowInteractor会自动建立一个默认的3D场景交互器样式(Interactor Style):vtkInteractorStyleSwitch,当然也可以选择其他交互器样式或者创建自己的交互器样式,如vtkInteractorStyleTrackballCamera。
vtkSmartPointer<vtkRenderWindowInteractor> iren =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
iren->SetRenderWindow(renWin); // 该方法用于设置渲染窗口,消息是通过渲染窗口捕获到的,所以必须给交互器对象设置渲染窗口。
// vtkInteractorStyleTrackballCamera是交互器样式的一种。该样式下,用户通过控制相机对物体作旋转、放大、缩小等操作。
// 打个比方,在照相时如果想要物体拍起来显得大一些,可以采取两种做法:第一种做法是相机不动,让要拍的物体靠近相机;第二种做法是物体不动,让相机靠近物体。第二种做法就是vtkInteractorStyleTrackballCamera的风格,其父类为vtkInteractorStyle,除了vtkInteractorStyleTrackballCamera之外,VTK还定义了其他多种交互器样式,如vtkInteractorStyleImage,用于显示二维图像时的交互。
vtkSmartPointer<vtkInteractorStyleTrackballCamera> style =
vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
iren->SetInteractorStyle(style); // 该方法用于定义交互器样式,默认的交互器样式为vtkInteractorStyleSwitch。
iren->Initialize(); // 该方法表示为处理窗口事件做准备,交互器工作之前必须先调用这个方法进行初始化。
iren->Start(); // 该方法表示开始进入事件响应循环,交互器处于等待状态,等待用户交互事件的发生。进入事件响应循环之前必须先调用Initialize()方法。
return EXIT_SUCCESS;
}
示例2.1执行效果:

加深理解
可以将以上示例看作一个舞台剧演出。观看舞台剧时,观众坐在台下,展现在观众面前的是一个舞台,舞台上有各式的灯光和各样的演员。演员出场时肯定是会先化妆,观众有时还会与台上的演员有一定的互动。
整个剧院就好比VTK程序的渲染窗口(vtkRenderWindow);舞台就相当于渲染场景(vtkRenderer);而那些演员就是程序中的Actor,台上演员与观众互动的方式有很多种,现场的观众可以直接上台与演员们握手拥抱,电视机前的可以法短信,计算机前的可以微博关注等,这就好比程序中的交互器样式(vtkInteractorStyle);对于舞台上的演员,观众都可以一一分辨出来,不会弄混,是因为他们穿着打扮、容貌都不一样,这就相当于程序中vtkActor的不同属性(vtkProperty);台下观众的眼睛可以看作vtkCamera,前排观众因为离得近,在观看台上演员时会觉得他们比较高大,而后排的观众因为离得远,所以那些演员看起来就会显得小些,每位观众看到的东西在他/她的世界里都是唯一的,所以渲染场景Renderer里的vtkCamera对象也是只有一个;舞台的灯光可以有多个,所以渲染场景里的vtkLight也存在多个。

《VTK图形图像开发进阶》第1-2章——一个稍微复杂的VTK程序的更多相关文章
- delphi图形图像开发相关
①delphi的图形处理(doc) http://wenku.baidu.com/view/519df09951e79b89680226ee.html ②delphi的图形图像处理(ppt) http ...
- 网站开发进阶(四)Tomcat Server处理一个http请求的过程
Tomcat Server处理一个http请求的过程 假设来自客户的请求为: http://localhost:8080/wsota/wsota_index.jsp 1) 请求被发送到本机端口8080 ...
- VS2013开发一个简单的asmx接口程序
一.开发和调试 1:创建一个ASP.NET web应用程序 2:选择空的模板 3:系统生成项目目录 4:右键项目-添加项-新建项 5:选择Web 服务(ASMX) 6:选择之后项目中会有一个Test ...
- C# .NET开发图形图像程序时提示"GDI+ 中发生一般性错误"
今天突然收到一封信,说我那个极度复杂的Marshal的问题被解决了(http://www.cnblogs.com/hotcan/archive/2005/01/12/91007.html).顿时感觉好 ...
- iOS开发进阶
<iOS开发进阶>基本信息作者: 唐巧 出版社:电子工业出版社ISBN:9787121247453上架时间:2014-12-26出版日期:2015 年1月开本:16开页码:268版次:1- ...
- HTML5游戏开发进阶指南(亚马逊5星畅销书,教你用HTML5和JavaScript构建游戏!)
HTML5游戏开发进阶指南(亚马逊星畅销书,教你用HTML5和JavaScript构建游戏!) [印]香卡(Shankar,A.R.)著 谢光磊译 ISBN 978-7-121-21226-0 201 ...
- 8 个优秀的 Linux 图形图像及色彩工具
8 个优秀的 Linux 图形图像及色彩工具 1. 硬件色彩分析器LPROF LPROF 是一个用于创建设备兼容,如相机.扫描仪.显示器的ICC兼容型材的颜色分析器.这些配置提供跨设备的色彩一致性.他 ...
- HTML5游戏开发进阶指南
<HTML5游戏开发进阶指南> 基本信息 作者: (印)香卡(Shankar,A.R.) 译者: 谢光磊 出版社:电子工业出版社 ISBN:9787121212260 上架时间:20 ...
- DSAPI 图形图像篇(上)
彩色文字对象 基于一些特殊需求,本人开发了彩色文字对象,该功能通过类似html代码的方式指示文本,并输出图像. 我们还是先来看一张图像. 这不是文本,是通过指定文本代码输出的图像.我们来看一下实现代码 ...
- PySide图形界面开发(一)
一.为什么要使用PySide? PySide由Qt的官方团队--Nokia Qt进行维护,集成了Qt和Python的优势.一个PySide程序员只需要使用简单的Python语言就能够发挥Qt的所有功能 ...
随机推荐
- Swift下Data处理全流程:从网络下载,数模转换,本地缓存到页面使用
Swift下将网络返回json数据转换成struct 假如网络请求返回的数据结构是一个深层嵌套的Json 首先要通过key-value取出这个json中的数据源 // 将返回的json字符串转Dict ...
- 【Python基础】数据类型与类型转换
五种基本数据类型 在 Python 中,基本数据类型是指不可变对象的数据类型.以下是 Python 中的基本数据类型: 整数类型(int):表示整数,例如 1.2.3 等等. 浮点数类型(float) ...
- 2023-04-26:给定一个数组componets,长度为A, componets[i] = j,代表i类型的任务需要耗时j 给定一个二维数组orders,长度为M, orders[i][0]代表i
2023-04-26:给定一个数组componets,长度为A, componets[i] = j,代表i类型的任务需要耗时j 给定一个二维数组orders,长度为M, orders[i][0]代表i ...
- url函数
url() 函数看起来的格式象:url(r^/account/$', views.index, name=index),它可以接收四个参数,分别是两个必选参数:regex.view 和两个可选参数:k ...
- (偶尔更新)【Linux】Linux常见不常用命令收集
本文时间 2023-05-20 作者:sugerqube漆瓷 cd,vi,clear这些属于常见常用命令本文不再赘述. 安装命令 yum install vim举例安装vim rpm -ivh a.r ...
- k8s资源对象(二)
Configmap和Secret资源介绍 secret和configmap资源都是通过挂载的方式将对应数据挂载到容器内部环境中去使用,两者的使用没有太多的不同 ,configmap资源通常用于为pod ...
- More than one file was found with OS independent path 'lib/armeabi-v7a/libflutter.so'
今日一个flutter 整合ai到原生android 时老是提示如下错误 Caused by: com.android.builder.merge.DuplicateRelativeFileExcep ...
- Django 有关 models 数据类型介绍:
在model中添加字段的格式一般为: field_name = field_type(**field_options) 一 field options(所有字段共用) 1 null 默认为F ...
- 如何科学地利用MTTR优化软件交付流程?
谷歌提出的衡量 DevOps 质量的 DORA 指标让 MTTR(平均恢复时间) 名声大振.在本文中,你将了解到 MTTR 的作用.为什么它对行业研究很有用.你可能被它误导的原因以及如何避免 MTTR ...
- 入门 Python GUI 开发的第一个坑
由于微信不允许外部链接,你需要点击文章尾部左下角的 "阅读原文",才能访问文中链接. 使用 Anaconda 3(conda 4.5.11)的 tkinter python 包(c ...