当前位置:文档之家› VTK培训教程

VTK培训教程

VTK培训教程
VTK培训教程

VTK 编程简介(转载) (3)

VTK数据类型 (7)

VTK教程之一可视化管线 (9)

VTK教程之二可视化管线的执行 (13)

VTK教程之三数据集 (15)

VTK教程之四单元和点集 (16)

VTK教程之五数据集的类型和数据集的属性数据 (22)

VTK教程之六构建数据集的例子程序 (26)

VTK教程之七可视化基础算法-概述 (28)

VTK教程之八可视化基础算法-颜色映射 (29)

VTK教程之九可视化基础算法-二维轮廓线(等值线)提取 (33)

VTK教程之十可视化基础算法-三维轮廓面(等值面)提取 (40)

VTK教程之十一可视化基础算法-方向线 (43)

VTK教程之十二可视化基础算法-几何体变形 (46)

VTK教程之十三可视化基础算法-位移图 (49)

VTK教程之十四可视化基础算法-用隐函数构建几何体 (53)

VTK培训教程之十五可视化基础算法-用隐函数提取数据集中的数据 (62)

VTK培训教程之十六可视化基础算法-用隐函数可视化随机或离散运动的物体 (65)

VTK(Visualization Toolkit)安装和配置

没有找到vc6.0或vc8.0下的安装版,若是用vc7.0话有现成的安装版本,只能自己动手编译了一下

安装版的配置环境(VC6,Windows)

1. 必须要下载的东西,VC6已经装好为前提:

vtk-5.0.4-win32.exe 安装程序https://www.doczj.com/doc/f918277041.html,的Download

vtk-5.0.4.zip 源程序

vtkdata-5.0.4.zip 数据

2. 安装vtk-5.0.4-win32.exe在D:\Program Files\VTK 5.0, 解压vtk-5.0.4.zip到D:\Program Files\VTK 5.0\vtk-5.0.4, vtkdata-5.0.4.zip到D:\Program Files\VTK 5.0\vtkdata-5.0.4

3. 用cmake编译到D:\Program Files\VTK 5.0\bin下,(这一步花了我不少时间,每次cmake 编译到一定量就死掉,不知道什么原因,编译了不下10次终于成功)

4. 参数设置,几个关键参数要注意;

vtk_use_guisupport,打开它,才能选vtk_use_mfc,再configure;

vtk_data_root: 目的是告诉cmake,vtk 需要的数据都在哪里,我们的数据在D:\Program Files\VTK 5.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, win32 console application, an empty project, 生成后给source files加一个test.cpp,把下面的代码放进去。

#include "vtkConeSource.h"

#include "vtkPolyDataMapper.h"

#include "vtkRenderWindow.h"

#include "vtkCamera.h"

#include "vtkActor.h"

#include "vtkRenderer.h"

#include "vtkProperty.h"

int main()

{

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 );

int i;

for (i = 0; i < 360; ++i)

{

renWin->Render();

ren1->GetActiveCamera()->Azimuth( i );

}

cone->Delete();

coneMapper->Delete();

coneActor->Delete();

ren1->Delete();

renWin->Delete();

return 0;

}

环境路径设置,这个比较重要:

1).修改Project setting->C/C++ ->Category->Preprocessor->Additional include directories:

D:\Program Files\VTK 5.0\vtk-5.0.4\Graphics,D:\Program Files\VTK 5.0\vtk-5.0.4\Filtering,D:\Program Files\VTK 5.0\vtk-5.0.4\Common,D:\Program Files\VTK 5.0\bin,D:\Program Files\VTK 5.0\vtk-5.0.4\Rendering

2). 修改Project setting->Link->Input->Object/library modules:

opengl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib vtkCommon.lib vtkDICOMParser.lib vtkexoIIc.lib vtkexpat.lib vtkFiltering.lib vtkfreetype.lib vtkftgl.lib vtkGenericFiltering.lib vtkGraphics.lib vtkHybrid.lib vtkImaging.lib vtkIO.lib vtkjpeg.lib vtkNetCDF.lib vtkpng.lib vtkRendering.lib vtksys.lib vtktiff.lib vtkVolumeRendering.lib vtkWidgets.lib vtkzlib.lib

3) Project setting> Link -> Category: Input -> Additional library path:

D:\Program Files\VTK 5.0\bin\bin\Debug

VTK 编程简介(转载)

0 如何利用文档

VTK 是由 Will Schroeder 等创立的 Kitware Inc. 的开放源码产品。Kitware 提供关于VTK 的技术支持和各种服务产品,包括教科书和用户指南:The Visualization Toolkit An Object-Oriented Approach To 3D Graphics, 3rd edition 和 The Visualization Toolkit User's Guide 。两本书的内容各有侧重,教科书主

要介绍可视化的各种算法以及 VTK 中的数据结构,而用户指南强调软件的使用方法。可以根据使用过程中遇到的不同问题参考两本书中的相应章节。编程中对具体的类、函数等的使用可以参考电子版的手册。编程中遇到的问题,可以在 VTK 的 maillist 上提出,一般都会有解答。

1 编译 VTK 库

1.1 准备源代码

从https://www.doczj.com/doc/f918277041.html,/下载源代码。源代码按成熟度依次分为官方发行版、每日打包版和 CVS 开发版,其中官方发行版最稳定,CVS 开发版最新。一般应用使用官方发行版即可。

1.2 用 CMake 产生具体平台下的工程文件

VTK 是用 C++ 语言开发的平台无关的图形库。为了使相互关联的 VTK 库代码能在不同平台(如Windows 和 Unix)和不同编译器(如 Visual Studio 6.0 和 Borland)下方便使用,Kitware 开发了 CMake 这一转换工具。比如使用 CMake,可以为 Windows 平台下的 Visual Studio 6.0 产生相应的工程文件(.dsp 或 .dsw 文件),此后就可以在 Visual Studio的集成开发环境(IDE)下进行编译连接了。

CMake 提供一个用户界面,用户可以定制某些变量,其中比较重要的是 BUILD_SHARED_LIBS,根据它的选择可以生成 VTK 的静态库或者动态链接库。如果编译成静态库,那么在开发应用程序时要将相应库代码加入可执行程序;如果是动态库,则可执行程序与动态链接库是分离的。用动态库的好处是可以减小主程序的体积,缺点是可执行程序不能独立运行。不过在有些情况下,因为某些专利算法在商业用途里只能授权使用,所以 VTK 提供的部分代码只能以动态链接库的方式使用,所以应该熟悉编译动态链接库的方法。其他较常见的重要变量有 VTK_USE_PATENTED 、VTK_USE_HYBRID 等,编译时使它们打开开关,就可以编译出相应的库以便日后使用了。

图 1

1.3 编译库

以下以 Windows 平台下的 Visual Studio 6.0 编译环境为例来说明使用方法,不再声明。

打开用 CMake 产生的 .dsw 文件,选择工程类型进行编译。工程类型主要分两类:Release 和Debug ,开发过程中一般用 Debug ,到发行时再用 Release ,所以在此用Debug即可。编译整个工程产生全部库,这个过程所需时间很长。编译完成后,会在 CMake 里面指定的目标目录内(如 vtkbin )产生编译出的库文件(缺省在 vtkbin/bin/Debug 目录内)。

2 在 Visual Studio 6.0开发环境下使用 VTK 库

VTK 库编译好了以后,就可以在 Visual Studio 开发环境下使用 VTK 库了。使用 VTK库首先要设置头文件和库文件的路径,以便使用 VTK 库的程序在编译和链接的时候可以搜索到。头文件的位置即源代码的各个子目录,里面包含了大量的 .h 文件。将其路径加入到 Visual Studio 6.0 的 Tools -> Options -> Directories 内,如图2。注意除了源码的各个子目录外,还要加上一个 vtkConfigure.h 文件的路径,它在 CMake 产生的目标目录内。库文件的设置与此类似,也在 Directories 页面进行,其路径是前述编译产生库文件的目录(如 vtkbin/bin/Debug )。这样设置好路径以后,使用 VTK 库的程序就可以正确地编译和链接了。对于使用动态链接库的程序来说,此时还不能运行编译出来的可执行程序( .exe),还需要一步,即把 VTK 的动态链接库文件所在路径加入操作系统的环境变量 PATH ,或直接将这些库文件拷贝到系统目录。

图 2

3 VTK 库编程特点

VTK 库是用面向对象的 C++ 语言写成的,由于主要开发者有着十数年涉及可视化系统的经验,所以 VTK 拥有非常合理的模型和结构。

VTK 的编程风格在教科书的附录A,包括命名规范、术语定义、各类对象的用途说明等。值得注意的,比如它的对象工厂(Object Factory)概念。在 VTK 里,是用::New() 的方式来初始化对象的,而不是用 C++ 中的 new 来新建对象,对象工厂不仅可以做到代码与设备无关,而且通过引用计数(reference counting),可以使程序清晰简明,不容易发生内存泄漏或崩溃的问题。

VTK 中实现了数百个类及其方法,它们之间简化的继承和关联关系可以从教科书附录 A.3 的图中看到。熟悉不同的类的用途和它们之间的关系,对编程十分有利。

对开发者来说,如何扩充这个类库是重要的,教科书的附录 A.4 介绍了这个问题,而用户指南的开发者指南部分有一章来讲具体的做法。

4通过例子学习 VTK 概念及编程

要用 VTK 库进行可视化编程首先要对可视化要有一定的概念和基础。除了普通的可视化教科书以外,VTK 提供的教科书本身就非常好。VTK 源程序包的 Example 目录包括了一系列例子,它们都有详尽的注释。一步步学习这些例子,可以很容易理解 VTK 涉及的可视化概念和 VTK 编程的一般特点。

学习这些例子首先要成功编译运行它们。这个步骤跟编译库类似,也需要先用 CMake 工具生成Visual Studio 的工程文件,然后编译;而要保证程序能正确运行,还得保证 VTK 库文件在环境变量的PATH 内。

初学者应该从 Tutorial 目录内的 Step x 例子入手,它们从最简单的 VTK 程序开始,一步步地增加概念,演示了各种可视化概念。注意例子里的注释,以第一个程序(Step1 的 Cone 程序)为例,看一下源程序:

源程序:Example/Tutorial/Step1/Cxx/Cone.cxx

//

// This example creates a polygonal model of a cone, and then renders it to

// the screen. It will rotate the cone 360 degrees and then exit. The basic

// setup of source -> mapper -> actor -> renderer -> renderwindow is

// typical of most VTK programs.

//

// First include the required header files for the VTK classes we are using.

#include "vtkConeSource.h"

#include "vtkPolyDataMapper.h"

#include "vtkRenderWindow.h"

#include "vtkCamera.h"

#include "vtkActor.h"

int main( int argc, char *argv[] )

{

//

// Next we create an instance of vtkConeSource and set some of its

// properties. The instance of vtkConeSource "cone" is part of a

// visualization pipeline (it is a source process object); it produces data

// (output type is vtkPolyData) which other filters may process.

//

vtkConeSource *cone = vtkConeSource::New();

cone->SetHeight( 3.0 );

cone->SetRadius( 1.0 );

cone->SetResolution( 10 );

//

// In this example we terminate the pipeline with a mapper process object.

// (Intermediate filters such as vtkShrinkPolyData could be inserted in

// between the source and the mapper.) We create an instance of

// vtkPolyDataMapper to map the polygonal data into graphics primitives. We

// connect the output of the cone souece to the input of this mapper.

//

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 片,因为它们符合 DICOM 3.0 标准,所以对它们的读取还是相对容易的。VTK 已经实现了这类数据的读取,vtkImageSource类的很多子类都可以完成这种工作,如vtkImageReader 类或者 vtkVolumeReader 等。这样我们编程的时候只要指定必须的参数,就可以实现对单张 CT 片乃至 CT 片序列的读取了。根据 VTK 的数据管道,原始数据读取入了以后,就可以使用各种各种过滤器进行数据转换,在这个例子里,即进行表面抽取、影射,然后就可以绘制了。因为是三维重建,所以还应该加入交互器,以便可以在绘制窗口里进行交互。

关于重建算法,对于 CT 片这种三维规则数据场,可以采取成熟、基本的算法来进行三维重建,比如 MarchingCubes 算法。

我们使用 Visual Studio 6.0 开发平台来完成上述的工作,使对 CT 片的读取、重建及显示、交互等功能融合到 MFC 的框架中,以便提供一个方便的用户接口。具体的程序另件给出,各部分的功能可以参考注释。

[参考文献]

1.The Visualization T oolkit An Object-Oriented Approach To 3D Graphics, 3rd edition

2.The Visualization T oolkit User's Guide

3.VTK 源码:https://www.doczj.com/doc/f918277041.html,/get-software.php

4.VTK 电子文档:https://www.doczj.com/doc/f918277041.html,/get-software.php

5.VTK 邮件列表:https://www.doczj.com/doc/f918277041.html,/mailman/listinfo/vtkusers

6.https://www.doczj.com/doc/f918277041.html,/new/course/vtk/index.htm

VTK数据类型

分为两种:vtk是基于C++的库,自然是面向对象的库了~ 对象类型有两种

图形模型对象(the Graphics Models)

可视化模型对象(the Visualization Models)

整个图形模型主要分为九类对象:

(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 标志可以设置scalar的数据是否影响相关的Actor 的颜色; ScalarMode 可以控制Actor的颜色是scalar point还是cell的值;渲染方式可以通过 ( ImmediateModeRenderingOn)和( ImmediateModeRenderingOff) 控制, 前一项表示立即渲染, 后一项表示将渲染放于渲染列表中, 一般选择ImmediateModeRenderingOn方式进行, 选择后者将会占用较多的系统资源, 影响系统的性能;

(9)变换(Transform):vtkTransform是一个放置4*4变换矩阵的堆栈, 可对这一堆栈进行各种操作, 如:平移, 缩放, 旋转等, 一般在栈的顶部进行。实现过程主要由渲染控制器创建渲染窗口,由渲染器在渲染窗口上绘制场景。场景包括绘制对象、映射、属性、变换、光源、照相机等。VTK获取数据的方式是基于拉技术, 即在管道的下一对象请求数据时, 管道对象才进行数据集的相关处理, 因此可减小系统的运算负荷, 这对提高系统实时性大有好处。

可视化模型(theVisualization Models)

用VTK进行可视化应用是非常方便的,它包括两个基本部分。首先,建立适当的目标图形来演示数据;其次, 建立一个数据流水线(data pipeline)来处理数据, 建立流水线(pipeline)就是将Source、Filters 和Mappers连接起来。VTK的可视化模型主要包括两类对象:

(1)数据对象

(a)多边形数据(vtkPloyData):表示由顶点、直线、多边形即三角面片组成的几何体, 支持多种的原子类

型, 如vtkVertex,vtk-PloyVertex, vtkLine 等。

(b)结构点数据(vtkStructurePoint):是一包括表面形状及几何形状的几何体。

(c)非结构点数据(vtkUnStructurePoint):指定了几何体的外观;结构网格( vtkStructureGrid):指定了几何

体的结构。

(d)非结构网格(vtkUnStructureGrid):可以为任意的cell 类型的组合。

(e)数据对象继承关系。

(2)过程对象

VTK 中定义的过程对象根据其pipeline主要包括了数据源(Source),过滤器(Filters),映射(Mappers),数据流水线(data pipeline),过程如图所示:

下载 (9 KB)

2007-12-24 11:50

数据源(Source): vtkSource是所有数据源的基类, 其子类定义了许多数据源类型;

过滤器(Filters):vtkFilter 是各种Filter的基类, 从vtkSource中派生出来, 接收Source 中的数据, 进行种

不同的Filter处理工作。Filters为VTK的主要部件, 由其基类派生出了许多子类, 实现了

图形学算法。将其封装起来, 用户只需要编写简单程序接口调用就可, 并可以通过改变

参数来达到想要的效果;

映射(Mappers) : vtkMapper 是所有Mappers 的基类, 从Filtes接受数据,并把其映射为图形库中的基本图

元。根据映射方式的不同, 有多个继承子类。

VTK教程之一可视化管线

VTK是一个基于面向对象的开源三维绘图软件包,和其它的的三维绘图引擎如OSG、OGRE不同之处在于,VTK可视化对象主要是各种数据,更加注重对数据分析处理后的可视化,可视化的内容是人们无法直接感受到的东西,如地质构造、地层分布、矿床分布、三维空间应力场的状态变化等等,而OSG、OGRE是基于场景的可视化,更强调视觉感官的感受,所以OSG主要应用于虚拟现实领域,而VTK主要应用于科学计算可视化领域,本教程主要介绍VTK的可视化应用。

VTK的可视化设计是基于管线流的设计模式,将要处理的数据作为流动介质在管线中流动,不同的阶段对数据有不同的处理方式,VTK的可视化管线主要由图形模型和可视化模型组成,如下图所示:

可视化模型主要对数据进行处理,生成可被绘制的几何体,而图形模型主要对生成的几何体进行绘制,在VTK的可视化管线中所包含的对象一般包括:源对象、过滤器对象(可选)、映射器对象、Props对象、绘制器对象、绘制窗口,其中源对象、过滤器对象(可选)、映射器对象、绘制器对象、绘制窗口为处理对象, Props对象为数据对象,映射器对象是可视化模型和图形模型的接口。

有了可视化管线,VTK的可视化过程就可以用数据在可视化管线流动的过程来描述(数据在管线中流动过程中,被管线不同的对象处理,最终以图形的方式表现数据信息),VTK的可视化管线具有如下特点:

1、变换

数据从原始的形式变换成图元的形式,最终以图形的形式显示。

2、表现

用VTK内部定义的数据结构描述数据,形成数据集,用图形的方式表现数据。

3、是基于面向对象的

用面向对象的观点描述可视化管线,表现是数据对象,变换是处理对象。

下面我们对VTK可视化管线的各个对象分别介绍,在可视化管线中,按对数据处理方式的不同,分为数据对象和处理对象,其中数据对象主要作用是表现数据信息,并对表现的信息进行维护(创建、访问、删除),处理对象主要是对输入的数据进行处理后生成输出新的数据,处理对象主要包括:

1、源对象

数据生成的源头,数据来源主要包括从磁盘读取数据文件,如VTK所支持的各种格式文件生成数据源对象,这种源对象被称为读源对象,或者利用数学方法生成源对象,如利用多个四边形构建一个圆柱体,这种对象被称为程序源对象。

2、过滤器对象

对源对象进行处理,生成新的数据集输出。

3、映射器对象

映射器对象主要作用是将可视化模型生成的数据转换到图形模型进行绘制,或者以磁盘文件的形式进行输出。

以上对VTK可视化管线做了一个简单的介绍,下面通过一个示例程序来说明数据是如何在可视化管线中流动的。

#include "stdafx.h"

#include "vtkCamera.h"

#include "vtkGenericRenderWindowInteractor.h"

#include "vtkInteractorStyleJoystickCamera.h"

#include "vtkInteractorStyleTrackballCamera.h"

#include "vtkLODActor.h"

#include "vtkLight.h"

#include "vtkPolyData.h"

#include "vtkPolyDataMapper.h"

#include "vtkPropPicker.h"

#include "vtkProperty.h"

#include "vtkRenderWindow.h"

#include "vtkRenderer.h"

#include "vtkSTLReader.h"

#include "vtkShrinkPolyData.h"

int main( int argc, char *argv[] ) {

//创建绘制器对象

vtkRenderer *ren1 = vtkRenderer::New();

//设置相机

ren1->GetActiveCamera()->SetClippingRange(0.294421 , 29.4421);

ren1->GetActiveCamera()->SetDistance(7.94348);

ren1->GetActiveCamera()->SetFocalPoint(-66.9367 , -49.4539 , 258.453);

ren1->GetActiveCamera()->SetPosition(-67.8091 , -57.3489 , 258.377);

ren1->GetActiveCamera()->SetViewAngle(20);

ren1->GetActiveCamera()->SetViewUp(-0.82718 , 0.0860684 , 0.555306);

ren1->GetActiveCamera()->SetParallelProjection(0);

ren1->GetActiveCamera()->SetUseHorizontalViewAngle(0);

ren1->SetBackground(0.1 , 0.2 , 0.4);

ren1->SetLightFollowCamera(1);

//创建绘制窗口

vtkRenderWindow *renWin = vtkRenderWindow::New();

renWin->AddRenderer(ren1);

renWin->SetSize(1134 , 624);

//创建交互器

vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New(); iren->SetRenderWindow(renWin);

iren->SetLightFollowCamera(1);

//读源对象读取stl数据文件

vtkSTLReader *part = vtkSTLReader::New();

part->SetOutput(part->GetOutput());

part->SetFileName("42400-IDGH.stl");

//创建过滤器对象,该对象将输入数据集的每个单元向单元质心收缩

//将会导致相邻单元之间出现裂缝

vtkShrinkPolyData *shrink = vtkShrinkPolyData::New();

//将源对象和过滤器连接

shrink->SetInput((vtkPolyData *) part->GetOutput());

//设置收缩系数,如果为1,不收缩

shrink->SetShrinkFactor(0.9);

//创建映射器对象

vtkPolyDataMapper *partMapper = vtkPolyDataMapper::New();

partMapper->SetInput((vtkPolyData *) shrink->GetOutput());

partMapper->SetNumberOfPieces(1);

partMapper->SetScalarRange(0 , 1);

partMapper->SetColorMode(0);

partMapper->SetResolveCoincidentTopology(0);

partMapper->SetScalarMode(0);

partMapper->SetImmediateModeRendering(0);

partMapper->SetScalarVisibility(1);

partMapper->SetUseLookupTableScalarRange(0);

//创建Props对象(Actor)

vtkLODActor *partActor = vtkLODActor::New();

partActor->SetMapper(partMapper);

partActor->GetProperty()->SetAmbientColor(0.8275 , 0.8275 , 0.8275); partActor->GetProperty()->SetColor(0.8275 , 0.8275 , 0.8275);

partActor->GetProperty()->SetDiffuseColor(0.8275 , 0.8275 , 0.8275); partActor->GetProperty()->SetOpacity(1);

partActor->GetProperty()->SetInterpolation(1);

partActor->GetProperty()->SetRepresentation(2);

partActor->GetProperty()->SetBackfaceCulling(0);

partActor->GetProperty()->SetEdgeVisibility(0);

partActor->GetProperty()->SetFrontfaceCulling(0);

partActor->SetOrigin(0 , 0 , 0);

partActor->SetPosition(0 , 0 , 0);

partActor->SetScale(1 , 1 , 1);

partActor->SetVisibility(1);

//将Actor对象添加到绘制器中

ren1->AddActor( partActor );

//绘制

ren1->ResetCamera();

ren1->ResetCameraClippingRange();

renWin->Render();

iren->Initialize();

iren->Start();

//删除对象

iren->Delete();

part->Delete();

partActor->Delete();

partMapper->Delete();

ren1->Delete();

renWin->Delete();

shrink->Delete();

return 0;

}

VTK教程之二可视化管线的执行

VTK可视化流水线主要将数据对象和过程对象组成,这两种对象相互之间可以用多种方式连接在一起,构成可视化管线的拓扑结构,在构建可视化管线拓扑结构时,必须要保证管线上游的对象输出的数据类型和其下游对象接收的数据类型保持一致,如一个源对象输出的是一个多边形数据类型,而和其连接的过滤器对象只能接收规则格网类型的数据,那么可视化管线就不能正确地执行,所以,在构建可视化管线时,一定要注意对象输入、输出之间数据类型的匹配性。

构建好可视化管线后,构成可视化管线的各个对象对数据的处理过程,成为可视化管线的执行,当管线中的过程对象或数据发生改变时,可视化管线都要重新执行,为了保证管线的执行效率,管线在执行过程中必须保持处理对象的同步,VTK采用隐式执行的方式保持同步,隐式执行的过程如下图所示:

隐式执行包含两个互逆的过程,在图中可以看到Execute()方法的执行是从左到右,UpDate()方法的执行是从右到左。

1、Execute()方法的执行

当可视化管线中的对象创建的时间发生改变时,表示对象已经更新,这时Execute()方法被调用,执行过程为从源对象通过过滤器对象到映射器对象。

2、UpDate()方法的执行

当图形系统请求绘制场景时,发出绘制请求(Render()),UpDate()方法被调用,请求管线中的每个对象更新数据,执行过程为映射器对象、过滤器对象、源对象依次调用Update()方法更新数据。

管线的隐式执行过程:

假设一个可视化管线由源对象、过滤器对象、映射器对象组成,其执行过程如下:

1)用户发出绘制场景的请求。

2)图形系统的角色(Actor)对象给映射器对象发送场景将要绘制的信息,管线开始执行。

3)映射器对象调用Update()方法,然后过滤器对象、源对象依次调用Update()方法。

4)源对象调用Update()方法后,开始比较当前被修改的时间和最后执行的时间,如果当前被修改的时间比最后被执行的时间更新,说明源对象最近被修改过,还未执行,于是调用Execute()方法开始执行流水线。

5)过滤器对象及映射器对象开始比较它们的修改时间和最后的执行时间,根据比较的结果决定是否调用Execute()方法。

可视化管线在执行过程中,提供了循环反馈机制、类型检查机制和内存均衡等,下面分别对这几种机制进行说明:

1) 循环反馈机制

在可视化流水线中引入反馈循环机制,用于将过程对象的输出数据变成输入数据反馈给过程对象,作为过程对象的输入数据,如下图所示,Integrate过滤器对初始输入的数据处理后,再将输出的数据反馈给Probe过滤器。

2)类型检查机制

类型指处理对象所能处理的数据类型,各种处理对象所能接收、处理和输出的数据类型是各不相同的,所以,在建立归管线的连接时,要明确所连接的处理对象所能接收和输出的数据类型,在VTK中,对输入数据类型的控制提供了两种方法,一种是建立单一数据类型处理的过程对象,只能处理单一的数据类型,另一种是建立数据类型检查机制,对数据类型进行检查,只有处理数据类型相互兼容的过程对象才能相互连接。

VTK教程之三数据集

一、数据可视化的特点

对数据可视化是VTK的主要功能,可视化模型的主要任务是对各种被可视化的数据进行组织和管理,形成具有一定结构形态的数据,然后映射到图形系统进行可视化处理,数据在可视化管线中流动的时候,每经过一次处理,数据都会从一种形态转变成另外一种形态,在VTK中,数据可视化具有如下的特点:

1、离散性

VTK可视化的数据都是离散的数据,这些离散的数据都是从一个无限的空间进行采样而得到的,用有限的离散数据近似的表达一个无限的空间,如对于二次方程y=x2,分别计算xi(i=1,2,...n)n个点的y值,

形成n个离散点(x1,y1,....xn,yn),然后把这些点用连续的线段连接起来,构成要绘制的方程,用有限的离散点表现连续的空间,常用插值、二次、三次曲面、样条函数等算法对离散点进行处理。

2、数据的结构是规则(结构化)的或是不规则(非结构化)的

构成结构化数据的离散点之间具有一定的层次关系,如格网数据结构就是结构化的数据,离散数据点之间具有很强的逻辑关系,非结构化数据的离散点之间没有逻辑关系,常用于表现性质差异变化比较大的数据,如不均匀物体的密度等信息。

3、数据具有一定的空间尺度

VTK可视化的数据具有一定的空间尺度,如点表现为0维,一维的线、二维的面和三维的体等,对于不同维度的数据,VTK提供了不同的可视化方法。

二、数据集

在VTK可视化管线中的数据对象,称为数据集,数据集主要由组织结构和数据属性两部分组成,如下图所示:

组织结构主要有几何数据和数据之间的拓扑关系组成,拓普关系描述了数据之间的一种固定的构成关系,在VTK中,这种构成关系被称为单元,几何数据用空间位置坐标表示,描述了数据在空间的位置,也描述了数据拓扑空间关系,如TIN数据由多个三角形构成,三角形被称为单元,描述这些单元所在空间的数据点就是几何数据。属性数据主要描述几何数据或单元数据的相关属性信息,如在地质应用中,常用属性数据表示某一个空间位置点的地层。

在VTK应用中,数据集的构成是很重要的内容,只有了解了这些,才能更好的构建自己需要可视化的数据。

VTK教程之四单元和点集

VTK的数据集对象主要由多个单元构成,如对于如下的多边形网格,其由多个四边形单元构成。

图中的各个顶点(1、2、3...25)定义了网格图形的几何形状,构成了数据集的几何数据,各个顶点依照构建的单元类型,按一定顺序排列,相互连通,构成了单元的拓扑结构,如在上图中,构建的单元类型为四边形单元,则第一个单元由1、6、7、2四个顶点按1、6、7、2顺序排列,构成一个四边形单元。

下面再给出一个6面体类型单元的例子,如下图所示:

图中的6面体单元由7、21、22、5、8、10、1、6共8个顶点构成,共有6个面、12条边,顶点8和10构成了一条边,顶点8、10、21、22构成了一个面,顶点坐标存储在顶点列表数组中,如图中左侧的Point list用于存储顶点坐标。

在VTK中提供了许多单元类型,下面分别对这些单元进行介绍。

1、顶点单元

基本的0维度单元,用单一的点来定义,如下图所示:

2、多顶点单元

基本的0维度单元,用多个点来定义,如下图所示:

3、线单元

基本的1维单元,由两个顶点定义,线的方向从第一个顶点指向第二个顶点,如下图所示:

4、多义线单元

组合1维单元,由多条线组合而成,多义线由一系列按顺序排列的N+1个顶点构成,N表示线段的数目,每相邻的两个点构成一条线段,如下图所示:

5、三角形单元

基本的2维单元,由三个按逆时针顺序排列的顶点构成,三角面的法线方向遵循右手规则,如下图所示:

6、三角条带

组合的2维单元,由N+2个按顺序排列的点构成,N表示三角形的数目,每相邻的三个点构成一个三角形,如下图所示:

7、4边形单元

基本的2维单元,由按逆时针方向排列的位于同一平面上的4个顶点构成,构成的4边形必须是凸4边形,4边形形成的平面法线方向遵循右手规则,如下图所示:

8、像素单元

四边形单元的特例,是一个正方形单元,构成单元的4个边相垂直正交,如下图所示:

9、多边形单元

基本的二维单元,由N个逆时针排列的顶点组成,这N个顶点位于同一平面上。多边形表面的法线遵循右手规则,如下图所示:

10、四面体单元

基本的3维单元,由4个不共面的点组成,一个4面体有6个边和4个三角面,如下图所示:

11、六面体单元

基本的3维单元,8个不共面的顶点构成,该单元必须是凸的,如下图所示:

相关主题
文本预览
相关文档 最新文档