解析渲染系统

 本文的目的旨在对vtk的渲染系统做一简要概述,并引入一些示例。如果读者已经阅读过官方出品的System Overview,文中的示例对初学者来说仍然具有一定意义。

 vtk包含两个基层子系统:一个已编译的C++类库,以及一个解释封装层。后者可以使用户能够使用Java、Python以及Tcl语言引用已编译的C++类。

 在vtk中存在两个基本对象模型,图像模型和可视化模型。两个必要模型共同构成成了vtk的基本概念系统。

 1、图像模型

 图像模型包含了以下一些基本对象,这些对象共同组成了一个“场景”:

 vtkActor,vtkActor2D,vtkVolume—vtkProp和vtkProp3D的子类

 vtkTransform

 道具Props是指我们能在场景中看到的物体,在vtk中道具使用一个抽象类vtkProp或vtkProp3D表示。通过使用上述类的子类而生成的实例变量即“角色”。应当注意,道具本身并不直接表示其几何形状,而是通过引用映射器mappers表示图形数据。另外,还可以使用一种转换对象,这种对象内部封装的4*4转换矩阵可用于控制道具的位置、方位和缩放比例。

 vtkLight

  灯光用于表示和操作场景照明,且仅需要在3D场景中使用。在场景中灯光与角色的相互作用是控制绘制过程的一个主要因素,一旦光线与场景中的角色发生相对作用,我们就可以使用相机进行观察。在计算机图形学中,使用过多种不同类型的灯光,其中,最简单的一种是在无限远处的点光源,这就意味着它所照亮的物体接受的是一组平行的光线。而另外一种是在有限区域内的点光源,其照射在物体表面上的光线不再互相平行。另外我们假设在光线的传播过程中,其能量不发生损失,即其光线强度始终保持不变。把这样简化了的模型用在可视化过程中,使得我们对光的计算公式也获得了简化。场景中的灯光包括漫反射光、镜面光以及环境光。

 vtkCamera

 相机用于控制在渲染过程中三维几何体如何被投影到二维平面。相机通过几种不同方法实现定位、焦点和指向功能。此外,相机也用于控制透视投影和立体视图。

 vtkProperty,vtkProperty2D

 属性对象控制了一个道具的外在属性,如颜色、漫反射、环境以及镜面光效果等。

 vtkMapper,vtkMapper2D—vtkAbstractMapper的子类

 vtkLookupTable,vtkColorTransferFunction—vtkScalarsToColors的子类

 映射器通过结合vtkLookupTable,用于转换和渲染几何图形。映射器为可视化管线和图像模型之间提供了接口界面。而vtkLookupTable以及vtkColorTransferFunction则负责把数值映射为颜色,这是可视化技术中最为重要的技术之一。 

 vtkRenderer,vtkRenderWindow

 渲染器与渲染窗口负责管理图像引擎和计算机窗口系统的接口。其中渲染窗口是在计算机窗口中进行渲染的窗口。可以有多个渲染器同时在一个渲染窗口中工作,也可以创建多个渲染窗口。渲染器工作的区域称为视口viewport。

 vtkRenderWindowInteractor

 一旦把对象绘制进渲染窗口,就有机会进行数据交互了。VTK提供了多种和场景进行交互的方法,其中之一就是引用vtkRenderWindowInteractor对象,这是一种简单的工具可用于操控相机、选取对象、调用invoke用户定义的方法、进入/推出立体观察视角以及改变部分角色属性等。

 2、可视化模型

 图像管线的作用是将图形数据转换成图像数据。而可视化管线的作用则是将图像信息转换成图形数据。换一个角度来看,可视化管线负责构建图形几何表示,然后再利用图像管线将这种表示绘制在渲染窗口中。

 VTK使用了数据流的方式将图像信息转换成图形数据,在这种方式中,包含了两个基本类型的对象:

 数据对象vtkDataObject

 处理对象vtkProcessObject

 数据对象可以表示各种类型的数据,具有一定组成结构的数据被称作数据集dataset,数据对象由几何结构和拓扑结构(点和单元),以及相关的属性数据如标量或向量组成。属性数据是与数据集的点或单元相联系的。单元是多个点的拓扑构成,它是组成数据集的原子类型。 

 处理对象,即我们通常所说的过滤器filter,它被用于对数据对象进行操作并产生新的数据对象。处理对象表示了系统中对数据进行处理的算法。数据对象和处理对象连接在一起就构成了可视化管线。

 在可视化管线中,源处理对象是通过读取或者构造一个或多个数据对象而产生数据的对象。过滤器通过吸收一个或多个数据对象,经过处理后,输出一个或多个数据对象。映射器则是将数据对象转换成图像对象,然后由图像引擎进行渲染。

 3、一些问题

 下面讨论在构造可视化管线中的值得特别注意的一些问题。

 首先,管线拓扑可以使用多种方法构造,如:

 aFilter->SetInput(anotherFilter->GetOutput());

 上述语句是将anotherFilter过滤器中的输出再用于aFilter过滤器的输出(多重输入和输出也有类似的方法)。

 其次,必须制定一个关于管线运行的控制机制。通常我们只想运行管线的那些必要功能以获取输出,vtk引入了基于每个对象内部更正时间的惰性计算lazy evaluation(即只在数据被请求时进行计算)模式。

 第三,管线的装配要求每个对象必须互相兼容,以适应SetInput()和GetOutput方法。在vtk中,c++程序会在编译时类型检查过程中检查此类问题,而对于解释型语言只能在运行时从解释器报错中发现问题。

 最后,必须决定是否在管线运行时使用缓存,亦或维持数据对象。

 4、管线执行概览

 前文已经提到,vtk可视化管线只有当请求数据计算时才会运行(惰性计算)。例如,如果用户实例化了一个Reader读取器对象,并随后请求返回象素点数GetNumberOfPoints,读取器对象将会通过该方法返回“0”,尽管事实上数据文件可能包含了数以千计的象素点。然而,如果在调用GetNumberOfPoints方法前加入一句:

 reader->update();

 读取器对象就会返回正确的象素点数目。出现这种情况的原因是,在前例中GetNumberOfPoints方法并不请求计算,对象仅仅返回当前的象素点数,首次计算前显然为“0”。而update()方法的作用即是强制运行管线,从而强制读取器从相关文件中读入数据。

 通常情况下,用户不需要manually手动调用update(),因为过滤器是接入可视化管线的。也就是说,当角色接收到重新渲染得请求之后,它会将相关方法转发至映射器,同时update()方法就被自动送入了可视化管线中。从较高层次来看,render()方法通常初始化对数据的请求,该请求再通过管线传递,此过程中管线待更新部分的过滤器将重新运行,从而保证了管线末端的数据是最新的。

Comments

次日依然悲剧

 可以预见,这也许会是本版的倒数第二篇文章了。

 有时候真的很担心场外因素介入到正常游戏规则里,然而它还是不可避免地发生了。但是最终的结果却让人感到一些欣慰,或许应该说是庆幸。

 感谢所有人。

Comments

首日悲剧

第一天就悲剧了。

Comments

最后一周

 再过一周就要正式录取了,到那时就已较当初决定读研过去了一年时间,复习开始到现在也有9个多月了。我一再提醒自己要重视过程,却没想到是因为结果往往出人意料。

 浩然兄说我当初就应该会后悔,仔细想了一下,确实还从未因为这事儿后悔过。因为这件事从三个月前起本来就远未达到我设想的安全概率,最后倒不如说是万幸。

 但是我的确没有办法使高高在上的人产生丝毫信任感,在我看来评价可以从简单的日常交谈到知识的厚积薄发,事实上它的复杂程度要比我想象中大得多。

 于是就突然又感到有些后悔,想方设法取得信任,这几乎从来都不是我所关心的事情:因为我当然信任我被信任的,而他应具备识别我可以被信任的能力,或者会用一些手段(当然凡是合理的要求我都会接受),否则我怎么能反过来信任他呢?

 记得一位哲学老师在启蒙课上引用了“哲学,就是疯子和傻子的对话”这句经典来描述哲学,问题是人们往往认为自己聪明,剩下的就只有贫穷的哲学工作者了。在追求“智慧”的道路上,已经产生太多悖于真理的观念,但我们根本无法和历史对抗。于是只能安慰自己说“与其想方设法取悦于人,倒不如努力做好自己”。

 我真觉得这些已经不重要了。

Comments

WordPress 3.0beta1 Arrived!

 伟大的WP在北京时间3日夜间抢先发布了里程碑式的3.0 beta1,此次更新包括了Custom Menu、WP/MU merge等我们一贯关注的内容(这也是我们日常促进程序自定义化的重点内容)。

 从test things上来看,新的缺省主题2010将支持自定义背景图片和页眉选项,对我们这些希望保持WP一贯风格的伪劣designer来说,真正支持傻瓜式DIY风格也是不错的思路。

 另外,3.0中会提供一个代码级功能,即Custom Post Types。从介绍来看这一功能仅仅是一个进行基本Types分类的便捷工具,熟悉tumblr的用户可能会乐于享受这种相当程度上的自动化。不过Kovshenin向我们展示了该扩展更为广阔的前景,WP在未来的持续扩张似乎已经不可避免了。

 下面是关于本文的一些链接:

 http://wordpress.org/development/2010/04/wordpress-3-0-beta-1/

 http://kovshenin.com/archives/custom-post-types-in-wordpress-3-0/

 对于我们来说,目前尚无足够的精力来全力体验和测试该早期beta版本,因此希望很快就能有更加稳定的版本释出。

 还有,别忘了我们的接头暗号:Touch it, Squeeze it, Turn it, Flip it!

Comments

安装与配置

 事实上,vtk users’ mannual和itk software guide两部手册即可满足本部分需要了。对于中文读者而言,改编自c3p社区原创文章的简略中文教程也已经在互联网中广泛流传。这里我们仅仅讨论一些常见安装问题和联用问题。

 对于VC6.0用户 而言,需要注意编译环境是否已经打上了Sevice pack 5,编译过程中出现的未响应问题大部分是sp5环境不存在或不完整所导致的。

 关于是否编译examples,一般建议初学者选择,但itk的该部分将耗费数G硬盘空间,而且严重降低编译效率,资源有限者慎选。

 关于itk在vc++6.0环境中的使用,我们要注意cmake文档的创建。例如对工程ItkRegMFC,我们可以构造如下CMakeLists:

[c][/c] PROJECT( ItkRegMFC )

ADD_DEFINITIONS(-D_AFXDLL)

SET(CMAKE_MFC_FLAG 2)

SET(ItkRegMFC_SRCS    stdAfx.cpp    stdAfx.h    ItkRegMFC.cpp    ItkRegMFC.h    ItkRegMFC.rc    ItkRegMFCDoc.cpp    ItkRegMFCDoc.h    MainFrm.cpp    MainFrm.h    ItkRegMFCView.cpp    ItkRegMFCView.h    )

IF(WIN32)   LINK_LIBRARIES(     wsock32   ) ENDIF(WIN32)

FIND_PACKAGE(ITK) IF(ITK_FOUND)    INCLUDE(${ITK_USE_FILE}) ELSE(ITK_FOUND)    MESSAGE(FATAL_ERROR            “Cannot build without ITK.  Please set ITK_DIR.”) ENDIF(ITK_FOUND)

ADD_EXECUTABLE(ItkRegMFC WIN32 ${ItkRegMFC_SRCS}) INSTALL_TARGETS(/bin ItkRegMFC) TARGET_LINK_LIBRARIES(ItkRegMFC ${ITK_LIBRARIES} ) [c][/c] 运行cmake生成相应的工程文件即可。

Comments

基于ITK+VTK的计算机医学图像处理技术研究(系列文章)

 今后几个月的时间里,我们将深入研究itk和vtk在计算机医学图像处理技术中的应用。itk是由美国国家医学图书馆发起的开源软件项目,该项目旨在促进人体信息数字化研究(Visible Human Project),是未来进行人体机能智能模拟工程的基础性研究项目。vtk则是致力于计算机图形图像处理和可视化的开源软件项目。

 一般而言,vtk(Visualization Tookit)本身即是一款强大的可视化软件系统,本系列引入itk(Insight Segmentation and Registration Toolkit),主要考虑有二:

 1、itk专注于医学图像分割与配准技术,在医用方面是对vtk很好的补充,也非常利于未来的功能扩展。

 2、当前版本的vtk(5.4.2)对DICOM通用标准医学图像的io支持性不佳。在已经进行的一系列试验中,vtk产生了一些不稳定状况,这可能会影响到本项研究今后的进展。

 下面我们将介绍各种软件系统的安装配置流程,我们预设的编译平台为Microsoft Visual Studio 6。

Comments

史无前例,史无前例呀!

遥想四年前,乃至七年、更远至十年以前,结局无非是瞥一眼成绩单,膜拜着英明无比的就近入学政策,与心目中真正的素质教育失之交臂。再加上天生郁闷的性格,使得自己在与青春期时代严重不符的资料和书海中沉溺了这十年。最终造成自己异于同龄人的心智模式(mental modal)。

这就造成了一个悲剧,别人会的自然,我却搞不明白,我热衷的别人不感兴趣,导致与其他同龄人很难在大部分问题上达成共识,也很难坦然面对。 当然这种情况也远未达到病态的程度,到了首次面对选择未来道路的时候,我想何不顺水推舟,选择继续读书。现实令人沮丧,摒弃推免这个天方夜谭的想法,顶住压力,走上复习这条漫长的不归路。 然而近六个月的鏖战之后,最终却失去了辛苦积攒的信心。反省多年来的读书时光,总是虚无缥缈,天南地北,从未考虑过现实的状况。父母希望我能留在西安工作,自己却期待远离这座生活了二十多年的陌生城市,期待着人烟稀少的田园城镇。 …… 现在,我似乎意识到是自己决心选择了这条路,期望保守,过程艰辛,当然也少不了口袋里的幸运兔脚和阅卷老师的泛泛洪水,终于向目标迈进了关键一步。仔细想想,自从纪年以来自己未放弃过任何人,任何事。然而由于这种惯常的心智,自己只能随着时间的推移逐步解开这些“结”,一结未开,何以前行,我的弱点再一次被纵容了。 奇怪的是,面对这些我却能坦然应付。剩下的,惟期望今后能少读几页马可·奥勒留,多享受些空气和阳光罢了。

Comments

A Break

离开了十天左右,因为要在月底前完成一个win32下的医学图像预处理工具。令人欣慰的是前期的编程工作已经基本结束,且接下来的数据实验阶段可能不会很快开始,因此近期的重点将重新放在网站建设上面…但由于行将开学,我注定还要奔波于见不到什么人的最后一个学期,因此设施更新进程就很难保证了。不过我们会在下个月开启一个新的板块,并讨论一些新问题。

构建仍在继续

最近两天重写了一部分后台代码,为新架构上线做最后准备。由于专业的限制,前端我们只能以简洁为主,如今看来倒形成了一定“风格”。三款浏览器兼容的问题目前已经基本解决了,接下来的主要任务是上线数据后台,由于该部分设计比较完整,预计工作将很快完成。 ps.无意中发现《云之遥》的第一部资料片已于早前首发,看来手上的工作又可以放一放了……

Comments