运行CMake
建立C++编译器后,安装CMake,并安装附件如Tcl、Java和Python。运行CMake,开始菜单下有一个CMake项,位于Programms->CMake->CMakeSetup。CMakeSetup.exe界面,图2-2是一个简单的界面,允许定制到特殊的机器和所希望VTK项。首先,我们必须告诉CMakeSetupVTK源代码树在哪里,所建的VTK二进制文件在哪里。你可以用浏览器按钮来指定这些目录,也可以手动地键入路径。下一步是选择使用的创建系统,MVC6或MVC.NET或Borland。一旦选择了源代码、二进制和创建系统,就可以点击Configure按钮,这将会用CMake缓存中一列变量和值来填充CMakeSetup界面。首次运行,所有的变量显示为红色。红色表示在先前定制步骤中,缓存项产生或被改变。
图2-2
这时,你可以定制自己的VTK创建。例如,想要激活VTK的Tcl的封装特性,向下滚动缓存值编辑器至VTK_WRAP_TCL,从YES或NO里选中一个值。然后,再次点击Configure按钮,这将会导致大多值变灰,新的值变红。如果从二进制文件中安装Tcl/Tk,非新值不会被发现,就不得不用CMake界面手工地指定这些路径。在CMake界面中设置任何值,需点变量的右边,依据变量的类型,将会出现一个文件选择器、编程框或下拉框,供你编辑值。VTK有一些重要的缓存值:
·BUILD_SHARED_LIBS—如果布尔值设置为YES,那么DLLs或共享库将会被创建;如果是NO,那么静态库将被创建。缺省是静态库。静态库易于执行,当可执行程序运行时,它们不必包含在路径中,可执行程序将会自我包含。这对基于应用的VTK分布比较好。
·VTK_WRAP_TCL—它决定是否建立TCL封装;
·VTK_WRAP_PYTHON—它决定是否建立PYTHON封装; ·VTK_WRAP_JAVA—它决定是否建立JAVA封装.
为了得到CMake变量的在线帮助,简单地单击变量的右边,选择“缓存项帮助”,大多数缺省值是可以更改的。
继续点击Configure按钮直到不再出现红色的值,这时都是你期望的值。此时,你再点击OK按钮。这将导致CMake写出所选的创建类型文件。对于Microsoft,工程文件被创建于所选的二进制目录中,简单于装载这个工程文件VTK.dsw到Visual Studio,在BUILD菜单下设置Set Active Configuration,选择Debug, Release, MinsizeRel和RelWithDebInfo。你可以选择ALL_BUILD工程,就像其它工程一样编译它。
VTK建立的所有库和可执行文件,都会被放于二进制目录下一个称为bin子目录下,
除非改变了EXECUTABLE_OUTPUT_PATH或LIBRARY_OUTPUT_PATH变量。(注意: 不要使用MSVC的“Rebuild All”来重新创建原代码,这会删除CMakeLists.txt文件,这些文件是先前产生的作为创建的一部分。MSVC会重新装载它们,将导致错误提示。如果想重新创建,必须先删除VTK二进制目录,重新运行CMake,然后再创建。)
创建VTK后,如果选择动态库,必须让Windows知道dlls文件的路径,这样做有几种方法:可以将dlls拷贝到系统目录system32;另一个办法是修改path环境变量,将库文件包含在目录中。如果你要拷贝DLLs和可执行程序,你需要拷贝bin/selected configuration/directory中所有的文件。
如果你不拷贝DLLs,那么你需要编辑path环境变量。在Windows95/98中,可以使用sysedit在autoexec.bat文件中加一行,下面给出4个例子分别对应4种不同的设置,假设4个例子都建立在VTK的C:\\vtkbin目录下。
在WindowsNT/ME/2000/XP中,点击“我的计算机”选择“属性”选择环境变量表,像上面一样添加或修改环境变量。如果PATH环境变量已经存在,就将VTK路径加在它的前面。例如
如果走到了这一步,说明你在PC机上成功地安装了VTK,这是一个富有挑战性的过程,部分由于当前编译器的限制,部分是由于软件大小和复杂程度,要小心前面的指令,遇到问题可以加入vtkusers mailing list寻求帮助,商业支持可以从Kitware公司得到。
第3章 系统总览
本章从整体上介绍Visualization Toolkit系统,介绍一些基本的信息,以便你用C++、Java、Tcl和Python创建应用程序。首先介绍基本的系统概念和对象模型抽象,最后来演示基本概念,描述所创建的应用程序。
3.1 系统设计
VTK由两个基本的子系统,一个是编译过的C++类库;一个是“解释型”的封装层,允许你使用Java、Tcl和Python等解释型语言操作编译过的类库,见图3-1
图3-1
可视化工具箱是一个用各种解释型语言(Java,Tcl,Python)封装的编译过的(C++)心
这样设计的优点能使你创建高效率的C++编译算法,保留解释型语言快速开发特点,当然对于C++高手来说,也有这样的工具,整个应用程序可以由C++来创建。
VTK是一个面向对象的系统,高效使用VTK的关键,是要逐渐较好地理解底层的对象模型,这样做是为了去掉数百个对象的神秘外衣。理解力达到一定程度,你很容易建立应用程序。也许你想知道许多对象的功能,只有反复练习代码例子,才能对对象有所理解。在本用户指南中,我们努力提供有用的对象组合来满足你的应用。
接下来的部分,我们来构成VTK的两个对象模型:图形对象模型和可视化对象模型。这部分相对高级—我们建议你强化阅读,运行本章和下一章数百个源代码布置的例子。
图形模型
VTK图形模型包含下列核心对象(这不是无穷对象列表,而是我们经常用到的对象):
我们把这些对象组合起来产生一个场景(参见对象表图14-8可以知道这些对象是如何联系在一起的)。Props代表我们在场景中“看见”的东西,在3D中(有一个4*4的变换矩阵)被定位和操作的Props就是vtkProp3D(例如vtkActor就是vtkProp3D的一个具体的子类,我们要进行体绘制,这个子类就是vtkVolume)。Props用来定位和表示2D数据(即图像)的类是vtkActor2D。Props不直接表示几何形状,它借助Mappers对象,Mapper负责表达数据。Props也借助于一个属性对象,属性对象控制着Props的外观(颜色、漫射光、反射光效果;绘制外观:线框或面片等)。Actors和Volumes(通过超类vtkProp3D)还有一个
内部变换对象(vtkTransform),这个对象封装了一个4*4矩阵,它依次控制着Prop的位置、朝向和尺度。
光照(vtkLight)用来表示和操作场景的光线,光照仅用于3D,2D不需要光照。
相机对象(vtkCamera)在绘制过程中控制如何将3D投影到2D,相机具有定位、定标和定向的几种方法。此外,相机还控制透视投影和立体视(若开启),2D图像不需要相机。
映射对象(vtkMapper)与查找表相连(vtkLookupTable),用来变换和绘制几何图形,映射提供可视化流水线与图形对象模型之间的接口。vtkLookupTable是一个vtkScalarsToColors类的子类,就像vtkColorTransferFunction(典型vtkColorTransferFunction用来体绘制,参见136页)。vtkScalarsToColors的子类将映射数据转变成颜色,是最重要的可视化技术之一。
Renderers(vtkRenderer) 和render windows(vtkRenderWindow)用来管理图形引擎和计算机窗口系统,绘制窗就是所绘制的计算机窗口。多个绘制者可在一个绘制窗口中绘图,也可以创建多个绘制窗口。绘制区称为视口,可能在一个绘制窗口存在多个绘制区。将绘制对象绘制到窗口后,就获得了与数据交互的机会。VTK有几种与数据进行交互的方法,其一就是vtkRenderWindowInteractor,它是一种简单的工具,用来操作相机、拾取对象、调用用户方法、进出立体视、改变actors属性等。
上面提到的许多对象都有子类,这些子类具体化对象行为,例如vtkAssembly、vtkFollower和vtkLODActor都是vtkActor子类。vtkAssembly允许Actors分级,恰当地管理平移、转变和尺度变换。vtkFollower是一个总是面向特定相机的Actor。vtkLODActor是一个Actor对象,可改变几何表达、保持交互帧频。
图3-2 VTK数据类型。非结构点能被多边形数据集和非结构网格来表示,因此不能在系统工程中显式表示。
可视化模型
图形流水线角色是将图形数据变换成图片,可视化流水线角色是将信息变换成图形数据。换句话说,可视化流水线负责构成几何表达,然后由图形流水线来绘制。VTK使用数