VTK培训教程.docx
《VTK培训教程.docx》由会员分享,可在线阅读,更多相关《VTK培训教程.docx(89页珍藏版)》请在冰豆网上搜索。
VTK培训教程
VTK(VisualizationToolkit)安装和配置
没有找到vc6.0或vc8.0下的安装版,若是用vc7.0话有现成的安装版本,只能自己动手编译了一下
安装版的配置环境(VC6,Windows)
1. 必须要下载的东西,VC6已经装好为前提:
vtk-5.0.4-win32.exe安装程序xvtk.org的Download
vtk-5.0.4.zip源程序
vtkdata-5.0.4.zip数据
2. 安装vtk-5.0.4-win32.exe在D:
\ProgramFiles\VTK5.0,解压vtk-5.0.4.zip到D:
\ProgramFiles\VTK5.0\vtk-5.0.4,vtkdata-5.0.4.zip到D:
\ProgramFiles\VTK5.0\vtkdata-5.0.4
3. 用cmake编译到D:
\ProgramFiles\VTK5.0\bin下,(这一步花了我不少时间,每次cmake编译到一定量就死掉,不知道什么原因,编译了不下10次终于成功)
4. 参数设置,几个关键参数要注意;
vtk_use_guisupport,打开它,才能选vtk_use_mfc,再configure;
vtk_data_root:
目的是告诉cmake,vtk需要的数据都在哪里,我们的数据在D:
\ProgramFiles\VTK5.0\vtkdata-5.0.4
build_examples:
就是询问是否编译vtk中的例子,我第一次的时候选上了,结果编译了2个小时的例子还没编译完,所以我后来选了off。
build_shared_libs:
如果设置为off,就只会生成lib文件,用于开发肯定是够了。
如果设置为on,将会多生成dll文件,这些dll需要拷到windows/system目录下。
。
建议选On,
5. cmake中选ok,在bin文件下,编译dsw文件就行,我大概花6分钟。
6. 测试:
这时新建一个project,win32consoleapplication,anemptyproject,生成后给sourcefiles加一个test.cpp,把下面的代码放进去。
#include"vtkConeSource.h"
#include"vtkPolyDataMapper.h"
#include"vtkRenderWindow.h"
#include"vtkCamera.h"
#include"vtkActor.h"
#include"vtkRenderer.h"
#include"vtkProperty.h"
intmain()
{
vtkConeSource*cone=vtkConeSource:
:
New();
cone->SetHeight(3.0);
cone->SetRadius(1.0);
cone->SetResolution(10);
vtkPolyDataMapper*coneMapper=vtkPolyDataMapper:
:
New();
coneMapper->SetInputConnection(cone->GetOutputPort());
vtkActor*coneActor=vtkActor:
:
New();
coneActor->SetMapper(coneMapper);
vtkRenderer*ren1=vtkRenderer:
:
New();
ren1->AddActor(coneActor);
ren1->SetBackground(0.1,0.2,0.4);
vtkRenderWindow*renWin=vtkRenderWindow:
:
New();
renWin->AddRenderer(ren1);
renWin->SetSize(300,300);
inti;
for(i=0;i<360;++i)
{
renWin->Render();
ren1->GetActiveCamera()->Azimuth(i);
}
cone->Delete();
coneMapper->Delete();
coneActor->Delete();
ren1->Delete();
renWin->Delete();
return0;
}
环境路径设置,这个比较重要:
1).修改Projectsetting->C/C++->Category->Preprocessor->Additionalincludedirectories:
D:
\ProgramFiles\VTK5.0\vtk-5.0.4\Graphics,D:
\ProgramFiles\VTK5.0\vtk-5.0.4\Filtering,D:
\ProgramFiles\VTK5.0\vtk-5.0.4\Common,D:
\ProgramFiles\VTK5.0\bin,D:
\ProgramFiles\VTK5.0\vtk-5.0.4\Rendering
2).修改Projectsetting->Link->Input->Object/librarymodules:
opengl32.libkernel32.libuser32.libgdi32.libwinspool.libcomdlg32.libadvapi32.libshell32.libole32.liboleaut32.libuuid.libodbc32.libvtkCommon.libvtkDICOMParser.libvtkexoIIc.libvtkexpat.libvtkFiltering.libvtkfreetype.libvtkftgl.libvtkGenericFiltering.libvtkGraphics.libvtkHybrid.libvtkImaging.libvtkIO.libvtkjpeg.lib vtkNetCDF.libvtkpng.libvtkRendering.libvtksys.libvtktiff.libvtkVolumeRendering.libvtkWidgets.libvtkzlib.lib
3)Projectsetting>Link->Category:
Input->Additionallibrarypath:
D:
\ProgramFiles\VTK5.0\bin\bin\Debug
VTK编程简介(转载)
0如何利用文档
VTK是由WillSchroeder等创立的KitwareInc.的开放源码产品。
Kitware提供关于VTK的技术支持和各种服务产品,包括教科书和用户指南:
TheVisualizationToolkitAnObject-OrientedApproachTo3DGraphics,3rdedition和TheVisualizationToolkitUser'sGuide。
两本书的内容各有侧重,教科书主要介绍可视化的各种算法以及VTK中的数据结构,而用户指南强调软件的使用方法。
可以根据使用过程中遇到的不同问题参考两本书中的相应章节。
编程中对具体的类、函数等的使用可以参考电子版的手册。
编程中遇到的问题,可以在VTK的maillist上提出,一般都会有解答。
1编译VTK库
1.1准备源代码
从xxvtk.org/下载源代码。
源代码按成熟度依次分为官方发行版、每日打包版和CVS开发版,其中官方发行版最稳定,CVS开发版最新。
一般应用使用官方发行版即可。
1.2用CMake产生具体平台下的工程文件
VTK是用C++语言开发的平台无关的图形库。
为了使相互关联的VTK库代码能在不同平台(如Windows和Unix)和不同编译器(如VisualStudio6.0和Borland)下方便使用,Kitware开发了CMake这一转换工具。
比如使用CMake,可以为Windows平台下的VisualStudio6.0产生相应的工程文件(.dsp或.dsw文件),此后就可以在VisualStudio的集成开发环境(IDE)下进行编译连接了。
CMake提供一个用户界面,用户可以定制某些变量,其中比较重要的是BUILD_SHARED_LIBS,根据它的选择可以生成VTK的静态库或者动态链接库。
如果编译成静态库,那么在开发应用程序时要将相应库代码加入可执行程序;如果是动态库,则可执行程序与动态链接库是分离的。
用动态库的好处是可以减小主程序的体积,缺点是可执行程序不能独立运行。
不过在有些情况下,因为某些专利算法在商业用途里只能授权使用,所以VTK提供的部分代码只能以动态链接库的方式使用,所以应该熟悉编译动态链接库的方法。
其他较常见的重要变量有VTK_USE_PATENTED、VTK_USE_HYBRID等,编译时使它们打开开关,就可以编译出相应的库以便日后使用了。
图1
1.3编译库
以下以Windows平台下的VisualStudio6.0编译环境为例来说明使用方法,不再声明。
打开用CMake产生的.dsw文件,选择工程类型进行编译。
工程类型主要分两类:
Release和Debug,开发过程中一般用Debug,到发行时再用Release,所以在此用Debug即可。
编译整个工程产生全部库,这个过程所需时间很长。
编译完成后,会在CMake里面指定的目标目录内(如vtkbin)产生编译出的库文件(缺省在vtkbin/bin/Debug目录内)。
2在VisualStudio6.0开发环境下使用VTK库
VTK库编译好了以后,就可以在VisualStudio开发环境下使用VTK库了。
使用VTK库首先要设置头文件和库文件的路径,以便使用VTK库的程序在编译和链接的时候可以搜索到。
头文件的位置即源代码的各个子目录,里面包含了大量的.h文件。
将其路径加入到VisualStudio6.0的Tools->Options->Directories内,如图2。
注意除了源码的各个子目录外,还要加上一个vtkConfigure.h文件的路径,它在CMake产生的目标目录内。
库文件的设置与此类似,也在Directories页面进行,其路径是前述编译产生库文件的目录(如vtkbin/bin/Debug)。
这样设置好路径以后,使用VTK库的程序就可以正确地编译和链接了。
对于使用动态链接库的程序来说,此时还不能运行编译出来的可执行程序(.exe),还需要一步,即把VTK的动态链接库文件所在路径加入操作系统的环境变量PATH,或直接将这些库文件拷贝到系统目录。
图2
3VTK库编程特点
VTK库是用面向对象的C++语言写成的,由于主要开发者有着十数年涉及可视化系统的经验,所以VTK拥有非常合理的模型和结构。
VTK的编程风格在教科书的附录A,包括命名规范、术语定义、各类对象的用途说明等。
值得注意的,比如它的对象工厂(ObjectFactory)概念。
在VTK里,是用:
:
New()的方式来初始化对象的,而不是用C++中的new来新建对象,对象工厂不仅可以做到代码与设备无关,而且通过引用计数(referencecounting),可以使程序清晰简明,不容易发生内存泄漏或崩溃的问题。
VTK中实现了数百个类及其方法,它们之间简化的继承和关联关系可以从教科书附录A.3的图中看到。
熟悉不同的类的用途和它们之间的关系,对编程十分有利。
对开发者来说,如何扩充这个类库是重要的,教科书的附录A.4介绍了这个问题,而用户指南的开发者指南部分有一章来讲具体的做法。
4通过例子学习VTK概念及编程
要用VTK库进行可视化编程首先要对可视化要有一定的概念和基础。
除了普通的可视化教科书以外,VTK提供的教科书本身就非常好。
VTK源程序包的Example目录包括了一系列例子,它们都有详尽的注释。
一步步学习这些例子,可以很容易理解VTK涉及的可视化概念和VTK编程的一般特点。
学习这些例子首先要成功编译运行它们。
这个步骤跟编译库类似,也需要先用CMake工具生成VisualStudio的工程文件,然后编译;而要保证程序能正确运行,还得保证VTK库文件在环境变量的PATH内。
初学者应该从Tutorial目录内的Stepx例子入手,它们从最简单的VTK程序开始,一步步地增加概念,演示了各种可视化概念。
注意例子里的注释,以第一个程序(Step1的Cone程序)为例,看一下源程序:
源程序:
Example/Tutorial/Step1/Cxx/Cone.cxx
//
//Thisexamplecreatesapolygonalmodelofacone,andthenrendersitto
//thescreen.Itwillrotatethecone360degreesandthenexit.Thebasic
//setupofsource->mapper->actor->renderer->renderwindowis
//typicalofmostVTKprograms.
//
//FirstincludetherequiredheaderfilesfortheVTKclassesweareusing.
#include"vtkConeSource.h"
#include"vtkPolyDataMapper.h"
#include"vtkRenderWindow.h"
#include"vtkCamera.h"
#include"vtkActor.h"
intmain(intargc,char*argv[])
{
//
//NextwecreateaninstanceofvtkConeSourceandsetsomeofits
//properties.TheinstanceofvtkConeSource"cone"ispartofa
//visualizationpipeline(itisasourceprocessobject);itproducesdata
//(outputtypeisvtkPolyData)whichotherfiltersmayprocess.
//
vtkConeSource*cone=vtkConeSource:
:
New();
cone->SetHeight(3.0);
cone->SetRadius(1.0);
cone->SetResolution(10);
//
//Inthisexampleweterminatethepipelinewithamapperprocessobject.
//(IntermediatefilterssuchasvtkShrinkPolyDatacouldbeinsertedin
//betweenthesourceandthemapper.) Wecreateaninstanceof
//vtkPolyDataMappertomapthepolygonaldataintographicsprimitives.We
//connecttheoutputoftheconesouecetotheinputofthismapper.
//
vtkPolyDataMapper*coneMapper=vtkPolyDataMapper:
:
New();
coneMapper->SetInput(cone->GetOutput());
程序段1
这个简单的例子是一个控制台下的程序,创建一个棱锥,在屏幕上绘制,旋转360度后退出。
程序虽简单,但已经包括了数据源、映射器、演员、绘制器、绘制窗口等概念,这些概念在VTK编程中几乎都是必然涉及的。
通过这个例子,就可以对教科书里讲到的各种可视化概念(如相机、演员),编程模型(如管道)等有直观的了解了。
这里仅举这个最简单的例子,事实上,VTK自带的例子循序渐进,从简单的概念,到各种复杂的概念、算法和数据结构、GUI编程、直到具体的应用等,都做了很好的例证。
结合教科书和例子,可以较快地理解VTK的各个方面。
比如说,如果要用VTK在Win32环境下编程,应该学习Example/GUI/Win32下的例程,如果要用MFC框架,那么可以参考其中的vtkMFC例程。
体会VTK库和Win32的关系、和MFC框架的关系,以便在这些平台上开发自己的程序。
这需要对VTK和操作系统、编程环境本身有比较深入的了解,而这种了解对自行开发程序是十分必要的。
5用VTK进行CT片三维重构
VTK作为一种通用的可视化类库,在科学和工程界有着广泛的应用。
其中一种重要而常见的应用就是在医学领域,比如著名的“可视化人”项目,就有VTK的应用。
实际上,VTK在医学方面的应用是是VTK比较强调的,在它提供的例程应用中,就有专门的医学目录。
学习它们,并应用于我们的项目中,是一条合适的途径。
比如,如果要做一个3D的医学影像系统,其中重要的一个环节就是三维重构,这也是在全膝置换手术中需要的。
所以,用VTK进行CT片的三维重构,就是一个合适的应用的例子。
利用VTK做CT片的三维重构,从算法和数据结构来看,就是一个读取数据问题和一个图形显示问题。
对于我们手里的CT片,因为它们符合DICOM3.0标准,所以对它们的读取还是相对容易的。
VTK已经实现了这类数据的读取,vtkImageSource类的很多子类都可以完成这种工作,如vtkImageReader类或者vtkVolumeReader等。
这样我们编程的时候只要指定必须的参数,就可以实现对单张CT片乃至CT片序列的读取了。
根据VTK的数据管道,原始数据读取入了以后,就可以使用各种各种过滤器进行数据转换,在这个例子里,即进行表面抽取、影射,然后就可以绘制了。
因为是三维重建,所以还应该加入交互器,以便可以在绘制窗口里进行交互。
关于重建算法,对于CT片这种三维规则数据场,可以采取成熟、基本的算法来进行三维重建,比如MarchingCubes算法。
我们使用VisualStudio6.0开发平台来完成上述的工作,使对CT片的读取、重建及显示、交互等功能融合到MFC的框架中,以便提供一个方便的用户接口。
具体的程序另件给出,各部分的功能可以参考注释。
[参考文献]
1.TheVisualizationToolkitAnObject-OrientedApproachTo3DGraphics,3rdedition
2.TheVisualizationToolkitUser'sGuide
3.VTK源码:
xxvtk.org/get-software.php
4.VTK电子文档:
xxvtk.org/get-software.php
5.VTK邮件列表:
xpublic.kitwarex/mailman/listinfo/vtkusers
6.xdigitalne.nju.edux/new/course/vtk/index.htm
VTK数据类型
分为两种:
vtk是基于C++的库,自然是面向对象的库了~对象类型有两种
图形模型对象(theGraphicsModels)
可视化模型对象(theVisualizationModels)
整个图形模型主要分为九类对象:
(1)渲染控制器:
定义与设备无关的坐标计算方法,创建绘制窗口;
(2)渲染窗口(RenderWindow):
其基类为vtkRenderWindow,管理显示设备上的窗口,一个或多个绘制方法可在渲染窗口上创建一个场景。
渲染窗口是用户图形界面,其中包括了设置渲染窗口的大小,产生立体显示效果等的方法,一共控制控制两个缓存;
(3)渲染器(Renderer):
基类为vtkRenderer,作用是管理光源、照相机和绘制对象等的位置、属性等;提供世界坐标系,观察坐标系及显示坐标系之间的转换。
建立好一个Renderer后将其加入RenderWindow中即可将场景显示出来;
(4)灯光(Light):
VTK中的实现类为vtkLight,
(5)照相机(Camera):
VTK实现类为vtkCamera,
(6)角色(Actor):
vtkActor代表渲染场景中的绘制对象实体,通过参数的调节可以设置角色的位置方向,渲染特性(Property),引用(renference),纹理影射(Texture)等属性,并可对Actor进行放缩。
角色的改变是通过一个4*4的变换矩阵实现的;
(7)属性(Property):
实现类为vtkProperty。
要使三维物体具有真实感,必须说明几何物体的一些特性,例如光照特性(泛光,漫反射,镜面反射,边缘颜色),反射强度,物体的灰度,物体的绘制样式(点,线框,表面),着色模式(flat,Gouraud,Phong)等;VTK中正是通过属性模型来对其进行说明的;
(8)映射(Mapper):
vtkMapper指定了渲染数据和图形库中基本图元之间的联系。
VtkMapper的一些派生
类通过LookupTable映射数据并控制图形库中相应Actor图元的生成。
一个或多个Act or可以使用相同的Mapper。
Mapper有多个参数对其进行控制,如ScalarVisibility标志可以设置scala