最近,重新学习了VTK相关内容,网上资料质量参差不齐,自己从多处搜集资料,整理记录之;
VTK简介
VTK,(visualization toolkit)是一个开源的免费软件系统,主要用于三维计算机图形学、图像处理和可视化。Vtk是在面向对象原理的基础上设计和实现的,它的内核是用C++构建的,包含有大约250,000行代码,2000多个类,还包含有几个转换界面,因此也可以自由的通过Java,Tcl/Tk和Python各种语言使用vtk。
视觉化工具函式库(VTK,Visualization Toolkit)是一个开放源码,跨平台、支持并行处理(VTK曾用于处理大小近乎1个Petabyte的资料,其平台为美国Los Alamos国家实验室所有的具1024个处理器之大型系统)的图形应用函式库。
VTK应用以及应用领域
1.应用
研究人员和开发人员用VTK来进行3D计算机图形,图像处理,可视化。VTK是在三维函数库OpenGL 的基础上采用面向对象的设计方法发展起来的,它将我们在可视化开发过程中会经常遇到的细节屏蔽起来,并将一些常用的算法封装起来。比如 Visualization Toolkit 将我们在表面重建中比较常见的MarchingCubes 算法封装起来,以类的形式给我们以支持,这样我们在对三维规则点阵数据进行表面重建时就不必再重复编写MarchingCubes 算法的代码,而直接使用Visualization Toolkit 中已经提供的vtkMarchingCubes 类。 Visualization Toolkit 是给从事可视化应用程序开发工作的研究人员提供直接的技术支持的一个强大的可视化开发工具。
在《医学图像编程技术》的前言中,作者讲到“KitWave公司希望使用VTK来完成用简单的代码来实现三维可视化编程工作”,随后推出的ITK(Insight Segmentation and Registration ToolKit),封装了最常用的医学图像处理算法,但是没有可视化算法,需要和VTK联合使用;
总结一句话就是VTK是一个可视化工具;
2.应用领域
通过VTK将科学实验数据如建筑学、气象学、医学、生物学或者航空航天学,对体、面、光源等等的逼真渲染,从而帮助人们理解那些采取错综复杂而又往往规模庞大的数字呈现形式的科学概念或结果。美国计算机科学家布鲁斯·麦考梅克在其1987年关于科学可视化的定义之中,首次阐述了科学可视化的目标和范围:“利用计算机图形学来创建视觉图像,帮助人们理解科学技术概念或结果的那些错综复杂而又往往规模庞大的数字表现形式”。
核医学成像:心脏SPECT图像(短轴视图)与心脏三维模型的融合
上图中,将仪器采集的实验数据通过计算机模拟成像,有助于发现医学问题。在航空航天方面,模拟飞行器轨道实验、风洞实验等,通过计算机模拟减少实际实验次数,可以降低成本,并可以多次实验找出问题。
我的理解是VTK可以将不可视的数据以图形学和模型的可视化方式呈现在使用者面前,可以进行模拟、仿真、推演等方式进行实验性或者辅助性的工作;
二、VTK工作原理
VTK既然是一个可视化工具,那么主要的功能就是对不可视数据进行可视化的展示;则就是一个简单或者复杂的流水线的处理模型;有输入的数据,有输出或者直接展示出来的数据或者窗口;
VTK中两个比较重要的概念就是:1.可视化管线;2.渲染引擎;
可视化管线是指用于获取或创建数据、处理数据以及把数据写入文件或者把数据传递给渲染引擎进行显示;可视化管线的三个基本要素是:数据对象(Data Object)、处理对象(Process Object)和数据流方向(Direction of Data Flow);
VTK在获取和创建数据方面提供了多个类,可以创建基础模型数据,读取各种数据类型文件;也可以将处理后的数据写入各类文件中,用于数据的持久化保存,在之后的其他文章会一一列举;
以第一个VTK程序为例,用来生成一个多棱的圆柱体;
其代码如下:
#include <vtkActor.h>
#include <vtkCamera.h>
#include <vtkCylinderSource.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <array>
int main(int, char*[])
{
vtkNew<vtkNamedColors> colors;
// 设置背景颜色
std::array<unsigned char, 4> bkg{{26, 51, 102, 255}};
colors->SetColor("BkgColor", bkg.data());
// 创建一个8棱圆柱体
vtkNew<vtkCylinderSource> cylinder;
cylinder->SetResolution(8);
// 创建映射器
vtkNew<vtkPolyDataMapper> cylinderMapper;
cylinderMapper->SetInputConnection(cylinder->GetOutputPort());
// 输入映射器,设置属性、转换角度或者纹理贴图;
vtkNew<vtkActor> cylinderActor;
cylinderActor->SetMapper(cylinderMapper);
cylinderActor->GetProperty()->SetColor(colors->GetColor4d("Tomato").GetData());
cylinderActor->RotateX(30.0);
cylinderActor->RotateY(-45.0);
// 渲染器将生成图像,然后显示在渲染窗口上。
vtkNew<vtkRenderer> renderer;
renderer->AddActor(cylinderActor);
renderer->SetBackground(colors->GetColor3d("BkgColor").GetData());
// 重置相机,设置缩放倍数
renderer->ResetCamera();
renderer->GetActiveCamera()->Zoom(1.5);
// 显示窗口
vtkNew<vtkRenderWindow> renderWindow;
renderWindow->SetSize(300, 300);
renderWindow->AddRenderer(renderer);
renderWindow->SetWindowName("Cylinder");
// 渲染窗口交互器可捕获鼠标事件,并将执行适当的照相机或演员操作;
vtkNew<vtkRenderWindowInteractor> renderWindowInteractor;
renderWindowInteractor->SetRenderWindow(renderWindow);
// 启动事件循环,整条管线被动执行;
renderWindow->Render();
renderWindowInteractor->Start();
return EXIT_SUCCESS;
}
换一种方式
另外一个博客中写这个流程讲的挺好认识VTK工作原理.
VTk通过数据流实现变信息为图形数据的。
数据流一般为:source—filter——mapper——actor——render——renderwindow——interactor。
要理解工作原理,首先明确几个类型:
1.vtkSource(数据源) 这个就好比一个剧本里面的角色,让演员知道要演的是什么人物。
数据源有:vtkConeSource,vtkSphereSource,vtkOutlineSource…等等。
它们都继承与vtkPolyDataAlgorithm类,该类用于提供不同的类型的数据源
2.vtkMapper(映射器) 它就像是一个剧本,应该如何塑造角色的装扮
映射器有:vtkDataSetMapper,vtkMultiGroupPolyDataMapper,vtkPolyDataMapper。
它们都继承于vtkMapper类。所有的数据对象都要通过映射器Mapper映射到vtkActor中。
3.vtkActor(演员) 有了剧本,有了角色,得找个真人来演出这个剧本了。
该类继承于vtkProp3D,有4个子类:vtkFollow,vtkLODActor,vtkMesaActor,vtkOpenGLActor.
4.vtkRenderer(渲染器) 场景或者舞台,演员在其中按照剧本表演,还会有各种灯光的设置;
该类继承于vtkViewport,有2个子类:vtkMesaRender,vtkOpenGLRender.
该类另外一个作用是设置窗口vtkRenderWindow的背景.
5.vtkRenderWindow(窗口) 这个就相当于个舞台 ,把准备好的演员放进去,准备表演了;
该类继承于vtkWindow,有2个子类:vtkMesaWindow,vtkOpenGLWindow.
6.vtkRenderWindowInteractor(窗口交互器) 我觉得这个应该是导演,用于指挥调度演员和场景的切换,比如控制镜头的推出和拉近,那些地方要给个特写,是一个操控舞台的上帝之手;
该类的继承关系在vtkRenderWindowInteractor文章中已给出。
7.vtkInteractorObserver(观察者) :我觉得这里应该是观众席上的观众们,每个不同的观众关注的细节,关注的场景都不一样,有的观众或会镜头旋转时做一些记录,有的观众可能在看表演时带上偏光镜;
VTK快速入门资料
有两本中文资料:《医学图像编程技术》和《vtk图形图像开发进阶》;
英文资料为《VTKUsersGuide》和《VTK_The Visualization Toolkit An Object Oriented Approach to 3D Graphics, 3rd Edition - Kitware Inc》;
官方提供了很多例子可以参考:https://kitware.github.io/vtk-examples/site/Cxx/
文中使用资料来源
vtk百度百科: https://baike.baidu.com/item/vtk/10785182?fr=aladdin.
认识VTK工作原理:https://www.cnblogs.com/yangai/p/5955614.html.