VTK(Visualization ToolKit)是一个开放源码、自由获取的软件系统,全世界的数以千计的研究人员和开发人员用它来进行3D计算机图形,图像处理,可视化。VTK包含一个c++类库,众多的翻译接口层,包括Tcl/Tk,Java,Python。 Visualization Toolkit 是一个用于可视化应用程序构造与运行的支撑环境,它是在三维函数库OpenGL 的基础上采用面向对象的设计方法发展起来的,它将我们在可视化开发过程中会经常遇到的细节屏蔽起来,并将一些常用的算法封装起来。比如Visualization Toolkit 将我们在表面重建中比较常见的Marching Cubes 算法封装起来,以类的形式给我们以支持,这样我们在对三维规则点阵数据进行表面重建时就不必再重复编写MarchingCubes 算法的代码,而直接使用Visualization Toolkit 中已经提供的vtkMarchingCubes 类。 Visualization Toolkit 是给从事可视化应用程序开发工作的研究人员提供直接的技术支持的一个强大的可视化开发工具,它以用户使用的方便性和灵活性为主要原则,具有如下的特点:
(1) 具有强大的三维图形功能。Visualization Toolkit 既支持基于体素Voxel-basedrendering 的体绘制Volume Rendering又保留了传统的面绘制,从而在极大的改善可视化效果的同时又可以充分利用现有的图形库和图形硬件。
(2) Visualization Toolkit 的体系结构使其具有非常好的流streaming 和高速缓存caching 的能力,在处理大量的数据时不必考虑内存资源的限制。
(3) Visualization Toolkit 能够更好的支持基于网络的工具比如Java 和VRML 随着Web 和Internet 技术的发展Visualization Toolkit 有着很好的发展前景。
(4) 能够支持多种着色。
(5) Visualization Toolkit 具有设备无关性使其代码具有良好的可移植性。
(6) Visualization Toolkit 中定义了许多宏,这些宏极大的简化了编程工作并且加强了一致的对象行为。
(7) Visualization Toolkit 具有更丰富的数据类型,支持对多种数据类型进行处理 。
(8) 既可以工作于Windows 操作系统又可以工作于Unix 操作系统极大的方便了用户。
2. VTK基本概念
VTK编程中的核心概念是pipeline,如图所示:
pipeline示意图
其中涉及的基本对象有9个:
下面是这些对象的简单描述和使用方法示例。
(1)Render Interactor: 用于实现与绘制窗口的用户交互。
vtkRenderWindowInteractor iren;
iren.SetRenderWindow(renWin); //与绘制窗口关联
iren.SetImeractorStyle(flightStyle);//设置交互方式
(2)RenderWindow: 接受1个或多个Renderer生成场景,并管理显示设备窗口。
vtkRenderWindow renWin;
renWin.AddRcnderer(ren); //关联绘制者
(3)Renderer: 对Light、Camera、Actor进行坐标定位。
vtkRenderer ren;
ren.AddActor(actor); //添加实体
ren.AddLight(1ight); //添加光源
ren.GetAetiveCamera(camera); //设置当前照相机
(4)Light: 对场景中的Actor赋予光照度。
vtkLight light;
light.SetColor(1,0,0); //设置光的颜色
light.SetFocalPoint(cam.GetFocalPoint);//设置光线焦点
light.SetPosition(cam.GetPosifion); //设置光源位置
ren.AddLight(1ight); //将光源与绘制者关联
(5) Camera: 定义场景的视角、焦点等属性。
VtkCamera cam;
Cam.SetClipingRange(O.0475572,2.37786); //设置视场法向范围
//设置焦点坐标
Cam.SetFocaclPoint(0.O52665,-0.129454,-0.0573973);
//设置照相机位置
Cam.SetPosition(O.327637,-0.116299,-0.256418);
//重置视场法向
Cam.ComputeViewPlaneNormal;
//置视场上下方向
cam.SetViewUp(-0.0225386,0.999137,0.034901);
//将照相机与绘制者关联
ren.SetActiveCamera(cam);
(6)Actor:场景中绘制的实体,由Mapper、property、transform对象定义。
vtkActor actor;
//设置相关联的映射器
actor.SetMapper(mapper);
//得到相关联的属性对象
prop=actor.GetProperty;
//设置属性对象的属性
prop.SetOpacity(O.25);
(7)Property: 用于设置Actor的颜色、亮度、纹理图、绘制方式和阴影方式等表面属性。
vtkProperty prop;
//设置不透明度
prop.SetOpacity(O.25);
//设置环境光照系数
prop.SetAmbient(O.5);
//设置漫反射光系数
prop.SetDiffuse(0.6);
//设置镜面光系数
prop.SetSpecular(1.0);
//没置镜面光强度
prop.SetSpecularPower(10.0);
(8)Mapper: 代表了实体的几何形状
VtkPolyDataMapper mapper;
Mapper.SetlookupTable(1ut); //指定查找表
Mapper.SetInput(plane.GetOutput); //设定输入
Mapper.SetScalarRange(0.197813,0.710419);//设定坐标最大值和最小值
(9)Transform: 定义Actor、Cameras、Lights的位置和方向,
由4 x 4变换矩阵和修改此矩阵的方法组成[23]。
vtkTransform trans;
trans.Identity; //转换模式初始化
trans.Translate(0.2,0,1.25); //转换
//指定X、v、z方向上的变换比例
trans.Seale(O.5,0.5,0.5);
3. VC环境下利用VTK开发体数据可视化程序步骤
在VC6.0下利用VTK4.2开发体数据可视化程序,其步骤如下:
(1)在CRayCastView中定义
vtkWin32OpenGLRenderWindow *renWin;
vtkRenderer *ren;
vtkWin32RenderWindowInteractor *iren;
vtkPiecewiseFunction *opacityTransferFunction;
vtkColorTransferFunction *colorTransferFunction;
vtkVolumeProperty *volumeProperty;
vtkVolumeRayCastCompositeFunction *compositeFunction;
vtkVolumeRayCastMapper *volumeMapper;
vtkVolume *volume;
(2)在CRayCastView构造函数中创建变量,并在析构函数中销毁这些变量。
(3)在OnCreate和OnSize函数中,设定vtkWin32OpenGLRenderWindowvtk和Renderer的相关参数。
(4)定义pipeline绘图函数,并在OnDraw函数中进行调用。
//设置透明度与颜色
opacityTransferFunction->AddPoint(20, 0.0);
opacityTransferFunction->AddPoint(100, 0.2);
colorTransferFunction->AddRGBPoint(0.0, 0.0, 0.0, 1.0);
colorTransferFunction->AddRGBPoint(12.0, 0.0, 1.0, 0.0);
colorTransferFunction->AddRGBPoint(12.0, 1.0, 0.0, 0.0); volumeProperty->SetColor(colorTransferFunction);
volumeProperty->SetScalarOpacity(opacityTransferFunction);
volumeProperty->ShadeOn();
volumeProperty->SetInterpolationTypeToLinear();
volumeMapper->SetVolumeRayCastFunction(compositeFunction);
volumeMapper->SetInput((vtkImageData*)pDoc->Reader->GetOutput());
volume->SetMapper(volumeMapper);
volume->SetProperty(volumeProperty);
this->ren->AddVolume(volume);
<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>