采用的入门教材:《医学图像编程技术》电子工业出版社 周振环 伍云智 赵明 编著。
上面这个教材听有人讲只是翻译了一下VTK的手册。但是我觉得还是值得看一看吧。
我的实验环境:VS2010 Win7 64位系统
安装时参照
来安装的。
因此跳过《医学图像编程技术》第一章:安装VTK和ITK
《医学图像编程技术》第二章是范例主要是讲解几个范例。我觉得可以在这一章节中多理解一下VTK的可视化管线。
我打算采用例子和补充材料的方式来学习这一章节。不过要准备回家了。明年再看啦!一共有15个范例。计划用5天的时间看完这一章。
2015年1月4日
过节回来啦!
下面从2.1入门范例-渲染一个圆锥开始
首先新建一个c++ 控制台应用项目空项目,项目名:ConeTest
在项目中添加cpp文件,ConeTest.cpp
打开项目属性
①在c/c++ 常规 ->附加库目录中添加如下:
②在项目属性->链接器->输入->附加依赖项中添加:
然后添加程序代码:
1、程序代码
#include "vtkConeSource.h"
#include "vtkPolyDataMapper.h"
#include "vtkRenderWindow.h"
#include "vtkActor.h"
#include "vtkRenderer.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);
//渲染360次,这里的主要作用是延时
int i;
for(i=10;i<360;++i)renWin->Render();
//清除对象
cone->Delete();
coneMapper->Delete();
coneActor->Delete();
ren1->Delete();
renWin->Delete();
return 0;
}
2、代码解释
头文件包含:这些头文件定义类在代码中要使用的VTK类,头文件名和代码中要用到的VTK类名相同。
①代码中首先创建了一个vtkConeSource类的实例,该对象表示一个圆锥体(实际上是一个正棱锥,但是当棱数足够多时,可以近似看做圆锥),接着设置了三个属性,分别是高度、半径和分辨率(分辨率是指侧面的个数,或者说是侧棱数)。
②vtkPolyDataMapper作用是把多边形数据映射为图元
像上面两个对象那样,将一个对象的输出当做另一个对象的输入的用法在VTK程序中是经常见到的,一般可以将多个对象串联在一起形成一条链,称之为可视化流水线。本例中流水线的源头是cone,尽头是coneMapper。
③ 然后创建一个vtkActor类的实例,并通过SetMapper方法将其与映射器关联在一起。vtkActor类表示场景中的一个实体,该实体的几何形状由关联的映射器对象确定,该实体的属性由相关联的属性对象确定。这枚没有用方法SetProperty()来显式关联一个属性对象,表明接受的是默认的属性对象。
④创建一个vtkRenderer类的实例ren1。vtkRenderer类表示一个渲染器,用于控制对象的渲染过程。用方法AddActor()添加需要被渲染的对象,用方法SetBackground()设置背景色。
⑤最后创建vtkRenderWindow类的实例renWin,该对象表示的是渲染用的窗口,供渲染者渲染用。用方法AddRenderer(0增加一个渲染着,用方法SeSize()设置窗口的大小。该对象有个方法Render(),用于执行对图像的渲染。
接下来是一个for循环,主要作用是用来延时。最后删除所有创建的对象并退出。
程序的结构如下图:
图2-2 渲染一个圆锥范例中各对象的关系
红色箭头表示的是流水线中数据的流向,黄色箭头表示的是对象间的关系。箭头边标有该关系的说明,可以这样理解:箭头起点的对象的说明文字是箭头重点对象,如”vtkRenderer“的”渲染窗口“是”vtkrenderWindow“.
在本例中,创建对象调用的是New(),清楚对象调用的是Delete();在VTK中,推荐使用这两个方法来保证设备的独立性及引用技术的妥善管理。在这里,Delete()方法的调用不是必需的,因为当程序终止运行后,独享会被自动删除。但一般来讲,对每个New方法总是需要调用一个相应的Delete()方法的。
第一个例子的笔记如上。对其中牵扯到的一些知识点,搜集资料和理解:
vtk工作流,有很多地方将vtk中的工作流比作演员角色剧本之类的,虽然在从未用过vtk的人看来很形象,但是我觉得对我来讲,很容易限制住对以后程序的理解,毕竟这不是从编程角度,而是从实际世界的角度去理解的。因此在后面的编程中,我有时候会不自觉的去用现实世界的场景去对应,这样不好,既影响了对程序的理解,而且限制了编程时的思路。当然可能是因为我现阶段学的还太少。
其实,我觉得这本书应该把第三章 数据集与数据属性 放在前面来讲,这样虽然上手稍微慢一点,但是容易对vtk有一个从编程方面从基础开始的理解。以上是我的观点。
VTK可视化管线:VTK可视化流水线主要将数据对象和过程对象组成,这两种对象相互之间可以用多种方式连接在一起,构成可视化管线的拓扑结构,在构建可视化管线拓扑结构时,必须要保证管线上游的对象输出的数据类型和其下游对象接收的数据类型保持一致,如一个源对象输出的是一个多边形数据类型,而和其连接的过滤器对象只能接收格网类型的数据,那么可视化管线就不能正确的执行,所以,在构建可视化管线时,一定要注意对象输入、输出之间数据类的匹配性。