3D——VTK使用
如果安装源码版本的话,还需要自己编译,生成DLL或者LIB,特别麻烦。
不过也有些优点,就是我们需要GCC使用的库,就生成GCC格式的库;我们需要VC6的库,就能生成VC6需要的库。我们需要动态链接库,就生成动态链接库,我们需要静态链接库呢?就为我们生成静态链接库。
不过一般人是不需要编译源代码的,因为那个太消耗时间了。建议还是晚上睡觉之前编译比较合适。
我们自己用的话,直接安装二进制版本就可以啦。
安装二进制版本
1.复制文件(DLL,头文件,库文件)。
2.修改环境变量(让OS自动找到VTK的DLL)。
安装数据文件
1.复制文件
2.设置环境变量
修改项目设置,包含VTK找到VTK头文件所在目录,找到VTK库文件所在目录。
一、简要介绍
VTK(Visualization Toolkit)是一款用于二次开发的可视化工具包,在世界上同类产品中最有影响,基本上可以作为可视化领域的规范。
VTK的历史和现状:
1993年12月,GE的Will Schroeder, Ken Martin两个人写了一本书: The Visualization Toolkit: An Object-Oriented Approach to 3D Graphics,VTK作为这本书的配套软件赠送。由于VTK的出色表现,人们对软件的关注程度远远超过了书,没有几年时间VTK就拥有了巨大的用户群。VTK现在是由kitware公司维护,以开源的形式开发,全世界所有的人都可以加入到开发者的行列。现在VTK的稳定版本是5.0,nightly 版本每天都会有更新。
VTK的特点:Open Source。采用CVS版本控制跨平台。支持Windows、Unix、Linux、Mac等多种平台功能强大。适合几乎所有的可视化领域,从医学可视化到数据可视化,都能找到VTK的用户支持多种语言开发。c语言当然不用说了,还包括脚本语言,如TCL、Python,也支持Java具有强大的开发团队。包括多家开发单位,具有商业化的维护,具有来自全世界使用者的智力资源:)
二、安装前的准备
因为VTK是开源的,我们能从官方网站上得到它的源码,又因为它是跨平台的,我们就要对源码进行一些包装,才能被gcc vc6.0等不同编译器所接受。VTK使用的跨平台工具是CMake,它也是kitware公司的产品,可以从官方主页上获取。
很多人不清楚cmake到底是干什么的,我这里想解释解释。我们下载的vtk源码都是用c++编写的,是一个大的工程,无论在什么平台,用什么编译器,你都要告诉编译器该如何去编译这么一个庞然大物。工程文件是工程的一般组织形式,比如vc6.0下面是dsw文件,gcc下可以把makefile看成这么一个东西。这些工程体系告诉编译器该干什么,需要什么样的参数等,好,cmake就是这样一个用来生成适合不同编译器所需要的工程文件的工具。 cmake为什么知道那些编译参数呢,这不得不提CMakeList.txt这个文件,正是这个文件,提供了这些信息,换句话说,如果没有CMakeList.txt,我们就不能使用cmake。有人又会问,如果不用cmake,可以编译vtk吗?那当然可以,比如在vc中,可以建立一个新的工程,把文件一个个往里面添加,编译选项也要自己加,在linux下,就自己写makefile,当然,这个方法几乎是无法实现的,就算实现,在今后的开发过程中还会遇到很多麻烦。所以,还是乖乖用cmake吧!
安装前,需要获得下面的文件,我这里以vtk5.0为例,在winxp+vc6.0和linux+gcc下实现
linxu:
预安装gcc3.0
vtk-5.0.0.tar.gz vtk的源码
vtkdata-5.0.0.tar.gz vtk例子所需要的数据
cmake-2.4.3-Linux-i386.tar.gz cmake程序,现在从官网上下载,是免编译的
windows:
预安装vc6.0
vtk-5.0.0.zip vtk的源码
vtkdata-5.0.0.zip vtk例子所需要的数据
CMSetup243-win32.exe cmake安装程序
上面不同系统下,vtk源码以及data其实是一样的,只不过使用了不同打包工具。另外,cmake版本的选择是根据vtk版本来定的,比如vtk5.0所需要的最低cmake版本好像是2.0,这里我们索性用更新的2.4。
三、windows下的vtk安装
1、安装cmake
这个应该很简单吧,windows下安装软件是傻瓜化的,运行CMSetup243-win32.exe,不停地点击下一步就行了
2、解压两个压缩包,建立所需文件夹
我不喜欢直接在源码里编译,而是另外建立一个bin文件夹。比如我把c:\vtk\作为我们的主目录,将vtk源码解压在vtk5.0这个文件夹中,把data解压在vtkdata这个文件夹中,再建立一个空的文件夹取名为bin。注意,.\vtk5.0下面,应该就是一大堆文件夹和文件,.\vtkdata下面应该也可以发现几个子文件夹。
3、运行cmake
首先,将源码和编译工作目录两个目录添好,在这个例子中,sourse code目录是c:\vtk\vtk5.0\,build 目录是c:\vtk\bin\。
再按configure按钮,cmake软件会让你选择需要使用的编译器,这里我们选vc6.0,然后,cmake就会对系统进行扫描了,停下来之后,我们就可以修改cmake选项了。
修改cmake选项。这个环节还真不好说,一般vtk的初学者只需要用默认设置就行了。我只提醒一些比较重要的选项:
build_examples: 就是询问是否编译vtk中的例子,如选则on,就要花时间把vtk的例子编译一遍,我一般不选
build_testing: test code 就是vtk开发者用来测试 vtk代码的一些测试代码,我们常常把它们当成学习vtk的例子,与build_examples类似,是否编译他们,看个人喜好。
build_shared_libs: 如果设置为off,就只会生成lib文件,用于开发肯定是够了。如果设置为on,将会多生成dll文件。他们的区别不是我这里说得清楚的,反正如果用静态库编程,应用程序可以独立运行,尺寸也比较大,如果用动态库编程,应用程序必须找到动态库才能运行,但尺寸可以做得比较小
cmake_install_divfix: 这个比较重要,就是以后要安装vtk的路径。有些人又要问,我编译完了不就可以用vtk了吗,为什么还要安装?对,不安装其实可以,安装的好处就是可以从 1G多的文件中提取出.h .lib .dll等精华,安装在指定目录下,并修改系统环境变量
vtk_data_root: 一般地,cmake可以自己找到vtkdata的路径,但如果没有,把c:\vtk\vtkdata\填上即可,告诉cmake,vtk需要的数据都在哪里
vtk_use_parallel: 对于想用vtk做并行计算的朋友,要把这个选上,对于只想学学vtk的,保持默认off
vtk_use_guisupport: 很多人把vtk安装好了,却无法运行vtk中与mfc混合编程的例子,提示错误都是缺少vtkmfc.lib,问题就出在这个选项,我们必须把它设置为 on,再次configure之后,会出现一个新的选项vtk_use_mfc,把它也设置为on就行了。
提示:在cmake中,有些选项是依赖于另一些选项的,比如vtk_use_guisupport和vtk_use_mfc,当我们禁用vtk_use_guisupport,vtk_use_mfc是看不到的。
修改完cmake选项以后,不停的按configure按钮,直到没有选项显示为红色,而且此时,ok按钮可用,点击ok按钮,就可以生成vc的工程文件了。
4、用vc6.0编译
用vc6.0打开bin目录下的vtk.dsw文件,因为文件很多,打开速度会有些慢。打开后,直接build。编译的用时和计算机性能,以及cmake中的一些选项有关,一般1个小时内可以完成。结果保存在.\bin\bin目录下。
编译也会出现不成功的时候,就要看编译器提示的错误类型来处理了!
5、安装
用vc6.0打开bin目录下的install.dsp文件,不用理会提示的错误,直接build。编译结果就会安装在cmake_install_divfix设定的目录下。这个时候,把c:\vtk目录删除都行。当然,建议保留,也许以后还要更改cmake选项,再次修复编译呢。cmake会检查到改动,只处理改动过的地方,没有改动过的就不要重新编译了。
四、在linux下的vtk安装
linux下安装和windows下安装思路是一样的,我这里假设你已经基本熟悉linux的基本操作。
1、安装cmake
现在从官方网站上下载的cmake是免编译的,我们可以直接在cmake源码的bin文件夹下找到ccmake这个可执行文件。就算没有编译,自己动动手,编译一下吧。另外,最好把ccmake命令加入到系统可搜索的范围内,这样就能直接运行ccmake命令了。
2、解压两个压缩包,建立所需文件夹
同window下安装,指定一个主目录,比如~/vtk/,建立三个文件夹,解包。
3、cmake
cd ~/vtk/bin/
ccmake ../vtk5.0
修改cmake的选项也参考前面windows下的vtk安装,因为linux下的cmake是文字界面,所以操作起来不直观,功能还是没有少的。
4、编译
cd ~/vtk/bin/
make
make命令可以看成是gcc编译器调用makefile文件,进行编译
5、安装
cd ~/vtk/bin/
sudo make install
这里之所以用sudo,是因为一些文件的读写需要root权限
五、总结
学习vtk最好的教材是vtk user guide,最好的解决的难题的方法是通过vtk mail list 、qq、论坛、google等方式。
VTK课程讲义分享
http://www.cadcaecam.com/forum/read.php?tid-5297-fpage-4.html
第四章 The Basics (VTK使用基础)
http://www.cadcaecam.com/forum/read.php?tid-4850-fpage-2.html
第六章 Visulizing Image & Volume Data(图像及三维体数据的可视化)
http://www.cadcaecam.com/forum/read.php?tid-4861-fpage-2.html
第11章 VTK中的数据对象接口(上)
http://www.cadcaecam.com/forum/read.php?tid-4859-fpage-3.html
第11章 VTK中的数据对象接口(下)
http://www.cadcaecam.com/forum/read.php?tid-4860-fpage-2.html
VTK示例程序
Creating a Sphere
C++
#i nclude "vtkSphereSource.h"
#i nclude "vtkPolyDataMapper.h"
#i nclude "vtkActor.h"
#i nclude "vtkRenderWindow.h"
#i nclude "vtkRenderer.h"
#i nclude "vtkRenderWindowInteractor.h"
void main ()
{
// create sphere geometry
vtkSphereSource *sphere = vtkSphereSource::New();
sphere->SetRadius(1.0);
sphere->SetThetaResolution(18);
sphere->SetPhiResolution(18);
// map to graphics library
vtkPolyDataMapper *map = vtkPolyDataMapper::New();
map->SetInput(sphere->GetOutput());
// actor coordinates geometry, properties, transformation
vtkActor *aSphere = vtkActor::New();
aSphere->SetMapper(map);
aSphere->GetProperty()->SetColor(0,0,1); // sphere color blue
// a renderer and render window
vtkRenderer *ren1 = vtkRenderer::New();
vtkRenderWindow *renWin = vtkRenderWindow::New();
renWin->AddRenderer(ren1);
// an interactor
vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
iren->SetRenderWindow(renWin);
// add the actor to the scene
ren1->AddActor(aSphere);
ren1->SetBackground(1,1,1); // Background color white
// render an image (lights and cameras are created automatically)
renWin->Render();
// begin mouse interaction
iren->Start();
}
Visualizing a Quadric Function
C++
#i nclude "vtkQuadric.h"
#i nclude "vtkSampleFunction.h"
#i nclude "vtkContourFilter.h"
#i nclude "vtkOutlineFilter.h"
#i nclude "vtkPolyDataMapper.h"
#i nclude "vtkActor.h"
#i nclude "vtkProperty.h"
#i nclude "vtkRenderWindow.h"
#i nclude "vtkRenderer.h"
#i nclude "vtkRenderWindowInteractor.h"
#i nclude "vtkImageData.h"
void main ()
{
// -- create the quadric function object --
// create the quadric function definition
vtkQuadric *quadric = vtkQuadric::New();
quadric->SetCoefficients(.5,1,.2,0,.1,0,0,.2,0,0);
// sample the quadric function
vtkSampleFunction *sample = vtkSampleFunction::New();
sample->SetSampleDimensions(50,50,50);
sample->SetImplicitFunction(quadric);
// Create five surfaces F(x,y,z) = constant between range specified
vtkContourFilter *contours = vtkContourFilter::New();
contours->SetInput(sample->GetOutput());
contours->GenerateValues(5, 0.0, 1.2);
// map the contours to graphical primitives
vtkPolyDataMapper *contMapper = vtkPolyDataMapper::New();
contMapper->SetInput(contours->GetOutput());
contMapper->SetScalarRange(0.0, 1.2);
// create an actor for the contours
vtkActor *contActor = vtkActor::New();
contActor->SetMapper(contMapper);
// -- create a box around the function to indicate the sampling volume --
// create outline
vtkOutlineFilter *outline = vtkOutlineFilter::New();
outline->SetInput(sample->GetOutput());
// map it to graphics primitives
vtkPolyDataMapper *outlineMapper = vtkPolyDataMapper::New();
outlineMapper->SetInput(outline->GetOutput());
// create an actor for it
vtkActor *outlineActor = vtkActor::New();
outlineActor->SetMapper(outlineMapper);
outlineActor->GetProperty()->SetColor(0,0,0);
// -- render both of the objects --
// a renderer and render window
vtkRenderer *ren1 = vtkRenderer::New();
vtkRenderWindow *renWin = vtkRenderWindow::New();
renWin->AddRenderer(ren1);
// an interactor
vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
iren->SetRenderWindow(renWin);
// add the actors to the scene
ren1->AddActor(contActor);
ren1->AddActor(outlineActor);
ren1->SetBackground(1,1,1); // Background color white
// render an image (lights and cameras are created automatically)
renWin->Render();
// begin mouse interaction
iren->Start();
}
VTK入门:
vtk简介
Vtk(visualization toolkit)是一个开放资源的免费软件系统,主要用于三维计算机图形学、图像处理和可视化。Vtk是在面向对象原理的基础上设计和实现的,它的内核是用C++构建的,包含有大约250,000行代码,650多个类,还包含有几个转换界面,因此也可以自由的通过Java,Tcl/Tk和Python各种语言使用vtk。 Vtk几乎可以在任何一个基于Unix的平台上操作,以及Windows 95/98/NT/2000/XP。
vtk的结构
Vtk比OpenGL和PEX高一个层面,这意味着在创建图形或可视化应用方面它将更加方便,更加简单。可以直接用C++,Tcl,Java,或Python各种语言编写的程序调用vtk。因为vtk的内核是C++,所以毫无疑问,使用C++调用vtk是最快的。但是使用解释型语言Tcl,Python(以及Tk),甚至附带GUI类库的Java语言也都能够很快的构建出所需的应用。
Vtk的安装
首先,你的电脑上应该装了Visual Studio .net(Visual Studio 6.0其实也可以,但是具体步骤要麻烦一些,后面写的是基于Visual Studio .net的),和WinZip(或WinRar)。
第一步,到网站http://www.cmake.org 下载并安装CMSetup.exe。我用的版本是1.8.3,当然更新的也行。
第二步,在http://public.kitware.com 或者ftp://public.kitware.com/pub/vtk下载vtk 4.2 或更新版本。以4.2版本为例,需要以下两个文件vtkNightlyData.zip,(Data无版本限制)VTK-4.2-LatestRelease.zip。将VTK-4.2-LatestRelease.zip解压缩到C:\,就有文件夹C:\VTK。将vtkNightlyData.zip解压缩到C:\,得到文件夹C:\VTKData。当然,也可以解压缩到其他的地方,这里只是以C盘为例,但是,注意路径长度不要超过260个字符。
第三步,在ftp://public.kitware.com/pub/vtk/misc/tcltk下载tcl832.exe,或更新版本并安装。
第四步,用CMake生成工程。打开CMake,在Show Advanced Values前打勾。Build For选Visual Studio 7.net。
其他的内容按照下面的表核对:
" Where is the source code: C:\VTK\
" Where to build the binaries: C:\vtkbin\
" VTK WRAP TCL EXE=C:/vtkbin/bin/$(IntDir)/vtkWrapTcl.exe
" VTK WRAP HINTS=C:/VTK/Wrapping/hints
" VTK USE 64BIT IDS=OFF
" VTK MANGLE MESA=OFF
" VTK DISPLAY WIN32 WARNINGS=OFF
" VTK DEBUG LEAKS=OFF
" TK XLIB PATH=C:/Tcl/include
" TK WISH=C:/Tcl/bin/wish83.exe
" TK LIBRARY=C:/Tcl/lib/tk83.lib
" TK INTERNAL PATH=C:/VTK/Rendering/tkInternals/tk83
" TK INCLUDE PATH=C:/Tcl/include
" TCL TCLSH=C:/Tcl/bin/tclsh83.exe
" TCL LIBRARY=C:/Tcl/lib/tcl83.lib
" TCL INCLUDE PATH=C:/Tcl/include
" LIBRARY OUTPUT PATH=C:/vtkbin/bin
" EXECUTABLE OUTPUT PATH=C:/vtkbin/bin
" CMAKE USE WIN32 THREADS=ON
" CMAKE MAKE PROGRAM=devenv.com
" CMAKE EXTRA LINK FLAGS=/STACK:10000000
" CMAKE CXX FLAGS RELWITHDEBINFO=/MD /Zi /O2
" CMAKE CXX FLAGS RELEASE=/MD /O2
" CMAKE CXX FLAGS MINSIZEREL=/MD /O1
" CMAKE CXX FLAGS DEBUG=/MDd /Zi /Od /GZ
" CMAKE CXX COMPILER=cl
" CMAKETEST COMMAND=NOTFOUND
" BUILD DOCUMENTATION=OFF
" BUILD EXAMPLES=ON
" BUILD SHARED LIBS=ON
" BUILD TESTING=ON
" CMAKE CXX FLAGS=/W3 /Zm1000 /GX /GR
" DART ROOT=NOTFOUND
" OPENGL LIBRARY=opengl32
" VTK DATA ROOT=C:/VTKData
" VTK USE ANSI STDLIB=OFF
" VTK USE HYBRID=ON
" VTK USE MATROX IMAGING=OFF
" VTK USE PARALLEL=ON
" VTK USE PATENTED=ON
" VTK USE RENDERING=ON
" VTK USE VIDEO FOR WINDOWS=OFF
" VTK USE VOLUMEPRO=OFF
" VTK WRAP JAVA=OFF
" VTK WRAP PYTHON=OFF
" VTK WRAP TCL=ON
按Configure键,直到所有选项都变成灰色的,按OK键,就会生成一个文件夹C:/VTKbin。
第五步,打开Visual Studio,编译C:/VTKbin中的VTK.sln。
第六步,添加TCLLIBPATH=c:/vtk/wrapping/tcl作为环境变量。具体方法如下,打开开始|控制面板|系统|高级|环境变量,然后添加就可以了。
第七步,打开Visual Studio .net,在工具|选项|项目|VC++目录|包含文件中添加如下目录:
" C:\VTK\Common\
" C:\VTK\Filtering\
" C:\VTK\Graphics\
" C:\VTK\Hybrid\
" C:\VTK\Imaging\
" C:\VTK\IO\
" C:\VTK\Parallel\
" C:\VTK\Patented\
" C:\VTK\Rendering\
" C:\vtkbin\
在工具|选项|项目|VC++目录|库文件中添加C:\VTKbin\bin\debug。
至此,vtk就装好了,也许这不是最简单的方法,但是也算是行之有效。
在C++环境下使用VTK
首先,可以先参考一下VTK中自带的例子,在C:\VTK\Examples\GUI\Win32\SimpleCxx这个文件夹中。这个文件夹中每个cpp文件都有一个对应的CMakeLists.txt文件,需要先用CMake编译,然后再用VC执行CMake编译后生成的sln文件。其实,直接用VC编译也是可以的,但是需要自己手动连接许多库文件等等,比较麻烦,所以强烈推荐使用CMake。
自己编写的cpp文件也可以用CMake编译,对于初期的一些较为简单的程序,可以复制VTK自带的例子里的CMakeLists.txt文件,只需改一下文件中的cpp文件名就可以了。
Vtk的功能很强大,我也只用过里面有关体绘制的几个类,只知其皮毛而已,所以就写到这里吧。如果有错误或不准确的地方,请大家批评指正。
VTK资料:
ftp://Graphics:Graphics@ftp.thuda.org:9021/_incoming/VTK%20User's%20Guide/02%20Installation.pdf
ftp://Graphics:Graphics@ftp.thuda.org:9021/_incoming/VTK%20User's%20Guide/03%20System%20Overview.pdf
ftp://Graphics:Graphics@ftp.thuda.org:9021/_incoming/VTK%20User's%20Guide/04%20The%20Basics.pdf
ftp://Graphics:Graphics@ftp.thuda.org:9021/_incoming/VTK%20User's%20Guide/05%20Visualization%20Techniques.pdf
ftp://Graphics:Graphics@ftp.thuda.org:9021/_incoming/VTK%20User's%20Guide/06%20Visualizing%20Image%20and%20Volume%20Data.pdf
ftp://Graphics:Graphics@ftp.thuda.org:9021/_incoming/VTK%20User's%20Guide/07%20Bulding%20Models.pdf
ftp://Graphics:Graphics@ftp.thuda.org:9021/_incoming/VTK%20User's%20Guide/08%20Data%20Interface%20&%20Miscellaneous.pdf
ftp://Graphics:Graphics@ftp.thuda.org:9021/_incoming/VTK%20User's%20Guide/09%20Contributing%20Code.pdf
ftp://Graphics:Graphics@ftp.thuda.org:9021/_incoming/VTK%20User's%20Guide/10%20Managing%20Pipeline%20Execution.pdf
ftp://Graphics:Graphics@ftp.thuda.org:9021/_incoming/VTK%20User's%20Guide/11%20Interfacing%20to%20VTK%20Data%20Objects.pdf
ftp://Graphics:Graphics@ftp.thuda.org:9021/_incoming/VTK%20User's%20Guide/12%20How%20to%20Write%20a%20Process%20Object.pdf
ftp://Graphics:Graphics@ftp.thuda.org:9021/_incoming/VTK%20User's%20Guide/13%20Integrating%20with%20the%20Windowing%20System.pdf
ftp://Graphics:Graphics@ftp.thuda.org:9021/_incoming/VTK%20User's%20Guide/14%20Coding%20Resources.pdf
ftp://Graphics:Graphics@ftp.thuda.org:9021/_incoming/VTK%20User's%20Guide/15%20CD-ROM.pdf
ftp://Graphics:Graphics@ftp.thuda.org:9021/_incoming/VTK%20User's%20Guide/content.pdf
ftp://Graphics:Graphics@ftp.thuda.org:9021/_incoming/VTK%20User's%20Guide/index.pdf