文档库 最新最全的文档下载
当前位置:文档库 › vtk使用基础[1]

vtk使用基础[1]

vtk使用基础[1]
vtk使用基础[1]

https://www.wendangku.net/doc/4f7841288.html,/Forum/index.htm
CadCaeCamPlm 专业门户网站 联系 HuangSteve@https://www.wendangku.net/doc/4f7841288.html,
第四章 The Basics (VTK 使用基础)
yefeng2005
一.主要内容:
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 的使 用基础,让用户了解 VTK 的使用方式。
“??D
章节内容:
1.1 创建简单模型
VTK 的主要的作用有:读取数据,产生数据,滤波处理,描绘图形和交互操作。其中,我们有两种 基本的方法来获得数据:数据存贮在文件中,我们就将其读到系统中;通过一些算法或者数学方式来产 生的数据。 (读取文件数据,自行生成数据) Source Objects:在可视化通道中进行初始化处理的对象。 Procedural (Source) Object:产生数据的对象(可产生球,立方体,锥体等图形) Reader (source) object:读取数据的对象 1.1.1 Procedural Source Object(源程序对象) VTK/Examples/Rendering/Tcl/Clinder.tcl 代码解释说明。 可以通过这个代码来了解一些基本的图形和 可视化的概念。(生成一个 8 边柱体) 1.1.2 Reader Source Object TK/Examples/Rendering/Tcl/CADPart.tcl 代码解释说明。(载入一个 STL 格式的文件)
1.2 使用 VTK 人机交互接口
VTK 有很多方法来使你与可视化的数据进行交互:(但都是以鼠标键盘为输入) 1.2.1 键盘 J/T 图形旋转风格,是鼠标左键按下就旋转还是要鼠标拖动才旋转 1.2.2 键盘 C/A 控制 camera 和 actor 的风格.camera 风格中,鼠标事件影响摄像机位置和焦点,而在 Actor 风格中鼠标事件只作用于 Actor.(按 A 后图像旋转时其外部框架不动) 1.2.3 鼠标左键,控制图形旋转 1.2.4 鼠标中键,(滚轮)控制图形移动 1.2.5 鼠标右键,控制图形放缩(滚轮的滚动也可以缩放图形) 1.2.6 键盘 E 退出 exit 1.2.7 键盘 R 将图像图形恢复到初始位置 1.2.8 键盘 P 绘制出所选图形的区域势力范围 1.2.9 键盘 U 可做为用户自定义的交互接口 1.2.10 键盘 W 只显示图形的轮廓线,或者说显示图形的网状结构 1.2.11 键盘 S 与键盘 W 相反恢复到正常显示状态 交互风格 VTK 中自定义的一些与交互相关的函数.在 VTK 中用 vtkInteractorStyleTrackballCamera:: SetInteractorStyle()这个方法来改变设置交互风格. 有关交互风格定义的类如下: https://www.wendangku.net/doc/4f7841288.html,/Forum/index.htm
CadCaeCamPlm 专业门户网站收集整理, 版权属于原作者 联系 HuangSteve@https://www.wendangku.net/doc/4f7841288.html,
第 1 页 共 10 页

https://www.wendangku.net/doc/4f7841288.html,/Forum/index.htm
CadCaeCamPlm 专业门户网站 联系 HuangSteve@https://www.wendangku.net/doc/4f7841288.html,
#include "vtkInteractorStyleTrackballCamera.h" #include "vtkInteractorStyleUnicam.h" #include "vtkInteractorStyleUser.h" #include "vtkInteractorStyleTrackballActor.h" #include "vtkInteractorStyleTerrain.h" #include "vtkInteractorStyleSwitch.h" #include "vtkInteractorStyleFlight.h" 以上类都是 vtkInteractorStyle 的子类 使用方式如下: vtkInteractorStyleTrackballCamera *style = vtkInteractorStyleTrackballCamera::New(); iren->SetInteractorStyle(style);
1.3 对数据的 filter 处理(滤波/过滤)
Filter 是一种数据处理机制,有一个或多个输入,有一个输出.其目的是对图形图像数据进行处理,以得到我 们期望中的数据. 如专门对图像数据进行处理的类有: #include "vtkImageSobel2D.h" #include "vtkImageLaplacian.h" #include "vtkImageHybridMedian2D.h" #include "vtkImageFFT.h" #include "vtkImageRFFT.h" #include "vtkImageButterworthHighPass.h" #include "vtkImageButterworthLowPass.h" #include "vtkImageIdealLowPass.h" #include "vtkImageIdealHighPass.h" #include "vtkImageAnisotropicDiffusion2D.h" #include "vtkImageAccumulate.h" #include "vtkImageConvolve.h" #include "vtkImageExtractComponents.h" #include "vtkImageGaussianSmooth.h" #include "vtkImageShiftScale.h" #include "vtkImageShrink3D.h" #include "vtkImageFlip.h" #include "vtkImagePermute.h" #include "vtkImageResample.h" #include "vtkImageConstantPad.h" #include "vtkImageMirrorPad.h" #include "vtkImageMagnify.h" 以上的类大都可以用作对二维图像的图像处理.也可以做为三维图像 volume 的图像处理. vtkShrinkPolyData 的作用是将图形中的所有三角面片缩小一定的比例,但整个图形的大小没有变,这就使得图 形中出现龟裂. 有关 VTK 管道流滤波的原理请看第 10 章,有关具体的管道流类的介绍使用方法请看第 14 章. https://www.wendangku.net/doc/4f7841288.html,/Forum/index.htm
CadCaeCamPlm 专业门户网站收集整理, 版权属于原作者 联系 HuangSteve@https://www.wendangku.net/doc/4f7841288.html,
第 2 页 共 10 页

https://www.wendangku.net/doc/4f7841288.html,/Forum/index.htm
CadCaeCamPlm 专业门户网站 联系 HuangSteve@https://www.wendangku.net/doc/4f7841288.html,
1.4 对摄像机 camera 的控制
Camera 在 VTK 中可以理解成视点,即观察图形的位置,或称虚拟照像机来实现 3D 视图 It is convenient to create an initial view of the data. The FocalPoint(视点) and Position form a vector(矢量) direction. Later on (ResetCamera() method) this vector is used to position the camera to look at the data in this direction. 对 camera 的操作方法如下: vtkCamera *aCamera = vtkCamera::New(); aCamera->SetViewUp (0, 0, -1);//设视角位置 aCamera->SetPosition (0, 1, 0);//设观察对象位置 aCamera->SetFocalPoint (0, 0, 0);//设焦点 aCamera->ComputeViewPlaneNormal();//自动 aRenderer->SetActiveCamera(aCamera); 关于 camera 还有两个重要的方法: Azimuth(150)//表示 camera 的视点位置沿顺时针旋转 150 度角 Elevation(60)// 表示 camera 的视点位置沿向上的方面旋转 60 度角 这两个方法使摄像机在一个球面中移动。
1.5 灯光控制
灯光在 VTK 中并不是十分必要的,当编程时,如果不设灯光的话会是正常显示图形,但如果设置了 光,那么出现的情况是阴影的出现,灯光照不到的地方将会出现明显的阴影。在我们的医学三维图像处理的编程 过程中还没有发现有用 Light 的必要. 灯光的设置比较简单,只要设定三个方法就可: SetColor()灯光着色 ,默认为白光 SetFocalPoint()灯光照向的位置,焦点 SetPosition() 光源位置 通常,所定义的光源为方向光源,光源位置和焦点决定光的方向. 程序范例: vtkLight *light = vtkLight::New(); light->SetFocalPoint(1.875,0.6125,0); light->SetPosition(0.875,1.6125,1); light->SetColor(1,0,0); ren1->AddLight(light);
1.6 Controlling 3D Props(控制 3D 图形)
1.6.1 设定三维图形在空间中的位置,初始时的旋转角度,起始点 vtkProp3D 类中的方法(vtkProp3D 是 vtkActor 的父类). 在 VTK 中用 vtkProp3D 用控制要绘制图形的位置,位置 的移动,图形的旋转,设置三维世界的标量.
https://www.wendangku.net/doc/4f7841288.html,/Forum/index.htm
CadCaeCamPlm 专业门户网站收集整理, 版权属于原作者 联系 HuangSteve@https://www.wendangku.net/doc/4f7841288.html,
第 3 页 共 10 页

https://www.wendangku.net/doc/4f7841288.html,/Forum/index.htm
CadCaeCamPlm 专业门户网站 联系 HuangSteve@https://www.wendangku.net/doc/4f7841288.html,
在对图形旋转时主要是对 XYZ 三个轴方向分别进行旋转,是先 Y 轴,然后 X 轴,最后 Z 轴
1.6.2 actor(演员) Actor 用来在一场景中表现一个可视化实体,也可以称之为 3D 图形的描绘实现.主要用作对图形的绘制,如一 些简单的球形,锥体. vtkActor is used to represent an entity in a rendering scene. It inherits functions related to the actors position, and orientation from vtkProp.The actor also has scaling and maintains a reference to the defining geometry (i.e., the mapper), rendering properties, and possibly a texture map. 其使用方式如下例 vtkPolyDataMapper *Mapper = vtkPolyDataMapper::New(); Mapper->SetInput(outline->GetOutput()); vtkActor *Actor = vtkActor::New(); Actor->SetMapper(Mapper); aren->AddActor(Actor); Actor 自身还包含一些属性,用来表示对显示对像的设置.属性有其自己的类 vtkPropertyProp 如: Actor->GetProperty()->SetColor(1,1,1);//(1,1,1)表白色,表示将绘制对象的着色设为白色. 对 Actor 的其他属性包括:透明度,镜像系数,扩散度等. 属性值还包括扩散颜色,反射颜色,外部颜色. 在 VTK 编程中也可以直接定一个属性类对象,然后将 Actor 与这个属性类对象相关连,如:
https://www.wendangku.net/doc/4f7841288.html,/Forum/index.htm
CadCaeCamPlm 专业门户网站收集整理, 版权属于原作者 联系 HuangSteve@https://www.wendangku.net/doc/4f7841288.html,
第 4 页 共 10 页

https://www.wendangku.net/doc/4f7841288.html,/Forum/index.htm
CadCaeCamPlm 专业门户网站 联系 HuangSteve@https://www.wendangku.net/doc/4f7841288.html,
对透明度进行设置的图形如下所显:
1.6.3 Assembilies 组合 在现实生活中,通常的物体都是复杂图形,我们可以用简单图形来组成复杂图形,在 VTK 中将一些描绘简单 图形的 actor 组装起来,合并成一个 actor,在绘制过程中,只要添加到一个 assembily 类中就可以显示多个图形.
1.7 纹理的使用(using texture)
可以将一个二维图像文件(如.bmp 格式文件)贴在一个三维图形上做为其纹理.如下图:
https://www.wendangku.net/doc/4f7841288.html,/Forum/index.htm
CadCaeCamPlm 专业门户网站收集整理, 版权属于原作者 联系 HuangSteve@https://www.wendangku.net/doc/4f7841288.html,
第 5 页 共 10 页

https://www.wendangku.net/doc/4f7841288.html,/Forum/index.htm
CadCaeCamPlm 专业门户网站 联系 HuangSteve@https://www.wendangku.net/doc/4f7841288.html,
上图的程序实现为: vtkBYUReader *model_reader=vtkBYUReader::New(); model_reader->SetGeometryFileName("teapot.g");//载入三维图形数据 vtkPolyDataNormals *model_normals=vtkPolyDataNormals::New(); model_normals->SetInput(model_reader->GetOutput());//法线设置 vtkTextureMapToCylinder *tmapper=vtkTextureMapToCylinder::New(); tmapper->SetInput(model_normals->GetOutput()); tmapper->PreventSeamOn(); vtkTransformTextureCoords *transform_texture=vtkTransformTextureCoords::New(); transform_texture->SetInput(tmapper->GetOutput());//纹理处理 vtkDataSetMapper *mapper=vtkDataSetMapper::New(); mapper->SetInput(transform_texture->GetOutput()); vtkJPEGReader *texture_reader=vtkJPEGReader::New();//载入图像文件数据 texture_reader->SetFileName("beach.jpg"); vtkTexture *texture=vtkTexture::New(); texture->SetInputConnection(texture_reader->GetOutputPort()); texture->InterpolateOn(); vtkActor *actor=vtkActor::New(); actor->SetMapper(mapper);//图形数据显示 actor->SetTexture(texture);//将图像映射到图形数据上
1.8 用 VTK 进行 CT 片三维重构
VTK 作为一种通用的可视化类库,在科学和工程界有着广泛的应用。其中一种重要而常见的应用就是在医 学领域,比如著名的“可视化人”项目,就有 VTK 的应用。实际上,VTK 在医学方面的应用是是 VTK 比较 强调的,在它提供的例程应用中,就有专门的医学目录。学习它们,并应用于我们的项目中,是一条合适的途径。 比如,如果要做一个 3D 的医学影像系统,其中重要的一个环节就是三维重构,这也是在全膝置换手术中需 要的。所以,用 VTK 进行 CT 片的三维重构,就是一个合适的应用的例子。 利用 VTK 做 CT 片的三维重构,从算法和数据结构来看,就是一个读取数据问题和一个图形显示问题。 对于我们手里的 CT 片,因为它们符合 DICOM 3.0 标准,所以对它们的读取还是相对容易的。VTK 已经 实 现 了 这 类 数 据 的 读 取 , vtkImageSource 类 的 很 多 子 类 都 可 以 完 成 这 种 工 作 , 如 vtkImageReader 类 或 者 vtkVolumeReader 等。这样我们编程的时候只要指定必须的参数,就可以实现对单张 CT 片乃至 CT 片序列的读 https://www.wendangku.net/doc/4f7841288.html,/Forum/index.htm
CadCaeCamPlm 专业门户网站收集整理, 版权属于原作者 联系 HuangSteve@https://www.wendangku.net/doc/4f7841288.html,
第 6 页 共 10 页

https://www.wendangku.net/doc/4f7841288.html,/Forum/index.htm
CadCaeCamPlm 专业门户网站 联系 HuangSteve@https://www.wendangku.net/doc/4f7841288.html,
取了。根据 VTK 的数据管道,原始数据读取入了以后,就可以使用各种各种过滤器进行数据转换,在这个例子 里,即进行表面抽取、影射,然后就可以绘制了。因为是三维重建,所以还应该加入交互器,以便可以在绘制窗 口里进行交互。 关于重建算法,对于 CT 片这种三维规则数据场,可以采取成熟、基本的算法来进行三维重建,比如 MarchingCubes 算法。
1.9 Picking
Picking 用来选取数据以及演员 actors,或者询问隐藏的数据属性.
vtkPicker is used to select instances of vtkProp3D by shooting a ray into a graphics window and intersecting with the actor's bounding box. The ray is defined from a point defined in window (or pixel) coordinates, and a point located from the camera's position. vtkPicker may return more than one vtkProp3D, since more than one bounding box may be intersected. vtkPicker returns the list of props that were hit, the pick coordinates in world and untransformed mapper space, and the prop (vtkProp3D) and mapper that are "closest" to the camera. The closest prop is the one whose center point (i.e., center of bounding box) projected on the ray is closest to the camera.
1.10 VTK 中的坐标系统
VTK 支持多种坐标系统,它用类 vtkCoordinate 来控制对不同的坐标系统进行设置. 1.10.1 对坐标系统的设置如下:( The coordinate systems in vtk are as follows:)
DISPLAY x-y pixel values in window NORMALIZED DISPLAY - x-y (0,1) normalized values VIEWPORT x-y pixel values in viewport
NORMALIZED VIEWPORT - x-y (0,1) normalized value in viewport VIEW WORLD USERDEFINED x-y-z (-1,1) values in camera coordinates. (z is depth) x-y-z global coordinate values x-y-z in User defined space
1.10.2 样例程序如下: https://www.wendangku.net/doc/4f7841288.html,/Forum/index.htm
CadCaeCamPlm 专业门户网站收集整理, 版权属于原作者 联系 HuangSteve@https://www.wendangku.net/doc/4f7841288.html,
第 7 页 共 10 页

https://www.wendangku.net/doc/4f7841288.html,/Forum/index.htm
CadCaeCamPlm 专业门户网站 联系 HuangSteve@https://www.wendangku.net/doc/4f7841288.html,
vtkCoordinate *normCoords= vtkCoordinate::New(); normCoords->SetCoordinateSystemToNormalizedViewport(); vtkPolyDataMapper2D *mapper= vtkPolyDataMapper2D::New(); mapper->SetInput(*&^*^*); mappe->SetTransformCoordinate(normCoords); 1.10.3 对坐标设置的方法如下: void vtkCoordinate::SetCoordinateSystemToDisplay(); void vtkCoordinate::SetCoordinateSystemToNormalizedDisplay(); void vtkCoordinate::SetCoordinateSystemToViewport(); void vtkCoordinate::SetCoordinateSystemToNormalizedViewport(); void vtkCoordinate::SetCoordinateSystemToView(); void vtkCoordinate::SetCoordinateSystemToWorld();
1.11 vtkActor2D
vtkActor2D 和 vtkActor 很相似,只不过它是对二维图形的操作. vtkActor2D is similar to vtkActor, but it is made to be used with two dimensional images and annotation. 使用范例如下: vtkPolyData *selectRect= vtkPolyData::New(); selectRect->SetPoints (pts); selectRect ->SetLines (rect); vtkPolyDataMapper2D *rectMapper= vtkPolyDataMapper2D::New(); rectMapper ->SetInput (selectRect); vtkActor2D *rectActor= vtkActor2D::New(); rectActor ->SetMapper (rectMapper);
1.12 在图形窗口上添加注释
在 VTK 中有两种方法为所生成的图形添加注释: (1)2D 注释,将文字放在二维的图形窗口上,文字不会因为用户的操作而变化 (2)3D 注释,将文字添加在所生成的三维图形上,或者将文字直接以三维图形的方式显示. 1.12.1 2D Annotation(二维注释) 程序范例如下: vtkTextMapper *textActor=vtkTextMapper::New(); textActor->SetInput ("This is a sphere");//所要显示的注释文字 vtkScaledTextActor *mmm=vtkScaledTextActor::New(); mmm->SetMapper(textActor); mmm->SetDisplayPosition(90, 50 );//设定注释位置 ren1->AddActor2D(mmm);//注释文字的绘制 在 vtkTextMapper 中,我们可以对文字的字体,大小,内容等属性做出更改,在 vtkScaledTextActor 中,我们可以控制 注释的位置,以及颜色.
https://www.wendangku.net/doc/4f7841288.html,/Forum/index.htm
CadCaeCamPlm 专业门户网站收集整理, 版权属于原作者 联系 HuangSteve@https://www.wendangku.net/doc/4f7841288.html,
第 8 页 共 10 页

https://www.wendangku.net/doc/4f7841288.html,/Forum/index.htm
CadCaeCamPlm 专业门户网站 联系 HuangSteve@https://www.wendangku.net/doc/4f7841288.html,
1.12.2 3D Annotation and vtkFollower 三维注释是用 vtkVectorText 来创建注释内容文字. vtkFollower 是绘制三维注释的一种方式. 程序范例如下: vtkVectorText atext atext SetText "Origin" vtkPolyDataMapper textMapper textMapper SetInputConnection [atext GetOutputPort] vtkFollower textActor textActor SetMapper textMapper textActor SetScale 0.2 0.2 0.2 textActor AddPosition 0 -0.1 0 ren1 AddActor textActor 程序运行效果如下:
其字体随着球的运动而运动.
4.13 三维数据的的转动(Transforming Data)
在 VTK 中,对三维数据的转动可以用 vtkTransformFilter 这个类来实现. vtkTransformFilter is a filter to transform point coordinates, and associated point normals and vectors. Other point data is passed through the filter. https://www.wendangku.net/doc/4f7841288.html,/Forum/index.htm
CadCaeCamPlm 专业门户网站收集整理, 版权属于原作者 联系 HuangSteve@https://www.wendangku.net/doc/4f7841288.html,
第 9 页 共 10 页

https://www.wendangku.net/doc/4f7841288.html,/Forum/index.htm
CadCaeCamPlm 专业门户网站 联系 HuangSteve@https://www.wendangku.net/doc/4f7841288.html,
An alternative method of transformation is to use vtkActor's methods to scale, rotate, and translate objects. The difference between the two methods is that vtkActor's transformation simply effects where objects are rendered (via the graphics pipeline), whereas vtkTransformFilter actually modifies point coordinates in the visualization pipeline. This is necessary for some objects (e.g., vtkProbeFilter) that require point coordinates as input. 另一个对三维图形的转动实现的类为 vtkTransformPolyDataFilter.该类主要用于对多边形数据的操作 vtkTransformPolyDataFilter is a filter to transform point coordinates and associated point and cell normals and vectors. Other point and cell data is passed through the filter unchanged. This filter is specialized for polygonal data. 使用范例如下: vtkTransform *transL1= vtkTransform::New(); transL1->Translate(3.7, 0.0 ,28.37); transL1->Scale( 5 ,5 ,5); transL1->RotateY( 90); vtkTransformPolyDataFilter *tf= vtkTransformPolyDataFilter::New(); tf->SetInputConnection (line->GetOutputPort()); tf-> SetTransform( transL1);
https://www.wendangku.net/doc/4f7841288.html,/Forum/index.htm
CadCaeCamPlm 专业门户网站收集整理, 版权属于原作者 联系 HuangSteve@https://www.wendangku.net/doc/4f7841288.html,
第 10 页 共 10 页

相关文档