VTK初学-抄书笔记

因为工作原因接触到VTK,学习了两个月有余也算是入了门,最近闲下来想到自己还有个CSDN账号,反正闲着也是闲着不如发点东西抄个书加深印象,然后就有了这个笔记

第一章 VTK概述

1.1 VTK概述

        数据可视化主要通过计算机图形学的方法,以图形、图像等形式清晰有效地传递、表达信息。随着数据获取手段的多样化以及数据规模的不断增长,数据可视化日益彰显其重要地位。从20世纪90年代起,针对数据可视化编程的工具包应运而生,VTK是其中最具代表性的工具包之一。

1.1.1 VTK是什么

        VTK全称是Visualization Toolkit,即可视化工具包,它是一个开源、跨平台、可自由获取、支持并行处理的图形应用函数库。

VTK最早是作为Prentice Hall在1993年出版的《The Visualization Toolkit:An Object-Oriented Approach to 3D Graphics》一书的附件出现的。该书及相应的VTK软件由美国GE公司的三位研究人员Ken Martin、Will Schroeder 和Bill Lorensen(后续就以Ken、Will、Bill称呼,名字打起来好麻烦)用闲暇时间合作编著与开发的,因此该软件的授权完全由他们决定。由于其开放源码式的授权,该书上市后,很快建立起VTK的使用者以及开发者社区交流平台,同时GE(特别式GE医疗系统)与其他数家公司也开始提供对VTK的支持。

        1998年,Will 和Ken离开GE后创立了Kitware公司(http://www.kitware.com)。有了Kitware的资金支持,VTK社区成长迅速,而且在学术研究及商业应用领域都受到了重用,例如Slicer生物医学计算软件使用VTK作为其核心,许多有关VTK的IEEE论文出现。VTK也是许多大型研究机构,如美国的Sandia、Los、Alamos及Livermore国家实验室与Kitware的合作基础,这些研究机构使用VTK作为数据可视化处理工具。VTK同时也是美国国立卫生研究院(National Institutes of Health,NIH)创立的美国国家医学影像计算合作联盟(National Alliance for Medical Image Computing,NA-MIC)的关键计算工具。

1.1.2 VTK能做什么

        三维计算机图形、图像处理及可视化式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的跨平台特性方便了各类用户。

1.1.3 如何获取VTK源码

VTK源码是开放的,可以自由从VTK网站(http://www.vtk.org)上免费获取源码,VTK源码的下载页面地址为http://www.vtk.org/VTK/resources/software.html。VTK的编译安装这里就不详细写,每个人的环境不同我这里也和开发教材上并不一样,这里就跳过。

1.2 创建一个简单的VTK程序

1.2.1 什么是CMake

        我这里用的并不是CMake,正如我上面说的那样环境和教材不太一样。但我还是想着记一下毕竟不一定什么时候就能用到。

        对于使用VTK的开发人员而言,CMake是一个必须了解的工具,CMake的产生与发展也与VTK息息相关。以下一段内容摘自维基百科,主要是关于CMake的历史:

        “CMake是为了解决美国国家医学图书馆出资的Visible Human Project项目下的Insight Segmentation and Registration Toolkit(ITK)软件的跨平台构建的需求而创造出来的,其设计收到了Ken开发的pcmaker的影响,pcmaker当初则是为了支持VTK这个开源的三维图形和视觉系统才出现的,现在VTK也采用了CMake。”

        从以上关于CMake的介绍可以知道,CMake其实就是一个跨平台的工程构建工具,可以根据不同的平台生成与平台相关的工程配置文件,比如,若Windows平台采用Visual Studio,则可以生成*.dsw、*.sln等项目文件。利用CMake可以管理大型的项目,VTK就是使用了CMake作为项目管理工具。同时,CMake也可以简化了工程构建过程,只要给工程里的每个目录都写一个CMakeLists.txt脚本文件,就可以通过CMake生成该工程的编译文件。CMake支持in-place构建(也就是生成的二进制文件与源文件在同一个目录)和out-of-place构建(编译连接生成的二进制文件和源文件分别在不同的目录)。

        CMake有自己的语言和语法,用CMake对工程进行管理的过程,就是编译CMakeLists.txt脚本文件的过程,原则上要求工程里的每一个目录都包含一个同名的文件,而且这个脚本文件的名字只能是CMakeLists.txt。假如写成cmakelists.txt,由于Windows平台不区别文件名大小写,因此可以通过CMake的配置与生成过程;但如果在别的平台,如Linux,用CMake构建工程时就会提示找不到CMakeLists.txt。所以,建议不管在哪个平台下,都使用CMakeLists.txt这个文件名,并注意大小写。

1.2.2 一个简单的VTK工程

        

#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2); // 初始化 OpenGL 渲染模块


#include <vtkSmartPointer.h>
#include <vtkRenderWindow.h>

int main()
{
    vtkSmartPointer<vtkRenderWindow> rw =
        vtkSmartPointer<vtkRenderWindow>::New();
    rw->Render();
    std::cin.get();
    return 0;

}

        vtkAutoInit是VTK用于自动初始化模块的头文件,用于确保在程序启动时正确加载和舒适化所需的VTK模块。

        这里需要用到VTK里的vtkRenderWindow和vtkSmartPointer两个类,所以包含相应头文件。VTK对类的命名都是小写的vtk开头,每个类的关键首字母大写。

        

vtkSmartPointer<vtkRenderWindow> rw =vtkSmartPointer<vtkRenderWindow>::New();

        这句用智能指针定义了一个类型为vtkRenderWindow的对象,这是VTK的类实例化对象的基本用法。因为VTK里每个类的构造函数都定义为保护成员,所以不能用以下的语句来定义一个VTK对象:

        vtkClassExample instance; //vtkClassExample这个类不存在,只是说明问题而已

否则会提示如下错误:

        error c2248:vtkClassExample::vtkClassExample:cannot access protected member declared in class vtkClassExample

        所以要构造VTK的对象可以用代码块中的方法,或者用以下方法:

vtkRenderWindow* rw = vtkRenderWindow::New();

注意:使用New()定义变量时,要在其生命周期结束前使用Delete()函数释放内存。   

rw->Render();

         这里调用vtkRenderWindow里的方法显示并渲染VTK窗口。

std::cin.get()

        这一行没什么特别意义,只是让程序停下,等待接受用户的输入,目的时显示VTK窗口。如果把它注释掉,VTK窗口会一闪而过。

        这个程序非常简单,只有一个VTK窗口,别无其它。但它确实是一个VTK工程,至少使用了两个VTK类,调用了一个VTK的方法。

        显示效果如下:

1.3 本章小结

        本章主要介绍了什么是VTK;VTK能做什么事情;如何获取VTK的源码。

        此外,简单介绍了一下CMake。通过一个简单的VTK程序——显示一个VTK窗口,来测试VTK是否成功安装

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值