VTK①基础概念
朋友对VTK和QT感起了兴趣,想我帮忙看一下。纯粹是外行,不过也无所谓了,所以就看一下吧~
从了解的角度来说,范围太大了,所以很难着手。按照惯例,就先看看VTK到底是什么吧。
VTK的定义:
- VKT是Visualization Toolkit的简称,是一个开源、跨平台的图形应用函数库。最早是在19993年GE的三维工程师利用闲暇时间构建的,后来其中两位成立了kitware公司(1998年)。目前VTK在生物医疗和大型研究机构领域的应用特别广泛。
- VTK的主要应用方向是三维计算机图形、图像处理及可视化。底层是OpenGL,采用面向对象的方式封装,本身是C++开发的,也提供包括Tcl/Tk、Java和Python的编程语言接口。显然,本人肯定是直接从VTK的Python入手的。
- VTK目前的版本(2020年12月)最新为9.0,直接提供的是python的wheel文件,当然也有源代码供在各个不同的环境下面去编译。
- VTK的学习资源(转载自CSDN的东灵工作室)
肯定是官网VTK.org
VTK User’s Guide, 目前已经到Edition 11
The Visualization Toolkit:An Object-Oriented Approach to 3D Graphics, 4th Edition
Source按季度发行的刊物
VTK在线帮助文档可以根据版本下载到本地
其他
Insight Journal Open Access on-line publication covering the domain for medicl image processing and visualization
VTK自带的各种Examples
VTK的目录基本结构:
InfoVis 信息可视化相关的类
Views 数据可视化的类,包括过滤器、可视化、交互和选择
CMake 用于编译的配置文件
Common 核心类库
Examples 各种参考案例
Filtering 可视化管道中与数据处理有关的类
GenericFiltering 与外部模拟包的接口适配框架
GeoVis 地形数据处理
Graphics 3D数据处理
GUISupport 界面开发的接口类,比如QT,MFC等等
Hybrid 同时对应图形学和图像处理功能
Imaging 图像处理
IO 读写数据
Parallel 并行处理
Rendering 渲染
Utilities 工具
VolumeRendering 体绘制
Widgets 3D组件
Wrapping 封装对包括TCL,Java和Python语言的支持
VTK的基本体系结构和流程
大的概念图:C++的核心类库 和 编程接口
核心理念
- 可视化管线
- 渲染引擎
在我看来,VTK的理解可以分成三个部分:
- 舞台,包括角色、相机、灯光、 - 展现和互动,包括窗口和窗口互动模式 - 数据源,角色的来源如果对应VTK的类,舞台就是vtkRender, 角色就是vtkActor,角色还有vtkProp,相机就是vtkCamera, 灯光就是vtkLight;数据源就是vtkXXXSource、vtkXXXFilter、vtkXXXDataMapper. 这些是VTK的核心
展现和互动就是renderwindow和renderwindowinteractor, 这个在应用中,一般好会自己来封装,比如用QTPython的简单代码
VTK用户手册里面CXX和Tcl/Tk的代码比较多,这里改造一下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29import vtkmodules.all as vtk # 可以直接import vtk 运行没问题,但是在pycharm vscode里面无法代码补全
cylinder = vtk\.vtkCylinderSource() # 定义DataSource
cylinder.SetResolution(8) # 设置
cylinder_mapper = vtk\.vtkPolyDataMapper() # 定义DataMapper
cylinder_mapper.SetInputConnection(cylinder.GetOutputPort()) # 数据源绑定
cylinder_actor = vtk\.vtkActor() # 定义角色
cylinder_actor.GetProperty().SetColor(1.0, 0.4, 0.3) # 设定角色属性,这里是颜色
cylinder_actor.RotateX(30.0) # 属性更新
cylinder_actor.RotateY(-45.0) # 属性更新
cylinder_actor.SetMapper(cylinder_mapper) # 绑定角色的数据源
ren1 = vtk\.vtkRenderer() # 舞台来了,渲染对象,既然有1,就可以有2,3,......
ren1.AddActor(cylinder_actor) # 舞台有了,角色登场
ren1.SetBackground(0.1, 0.2, 0.4) # 舞台背景
ren_win = vtk\.vtkRenderWindow() # 舞台的展示窗口
ren_win.AddRenderer(ren1) # 把舞台放到展示窗口
ren_win.SetSize(300,300) # 设置展示窗口大小
iren = vtk\.vtkRenderWindowInteractor() # 得让观众和舞台上的交互啊
iren.SetRenderWindow(ren_win) # 适合这个展示窗口交互
iren.Initialize() # 交互初始化
ren_win.Render() # 大幕来开,渲染
iren.Start() # 交互开始读源文件的代码【42400-IDGH.stl】
从7.1.1开始,examples中的数据就不再是文件名了(再往前就不知道了),这里以9.0为例,可以看到VTKData9.0.1里面的数据全部是md5加上.data或者.paxheader的文件,在用户手册中有些例程需要用到测试数据,这些数据哪里去找呢?比如,例程:VTK/Examples/Rendering/Python/CADPart.py, 读取“42400-IDGH.stl”文件。在VTK9.0.1的源代码中
1
$ find |grep 42400-IDGH.stl
结果是
1
./Testing/Data/42400-IDGH.stl.SHA512
也就是能在Testing的Data目录中找到这个文件,是个文本文件,打开就是字符串“7edca2078c26d9647f189353967634c9c4c104b3ef7c81191f1cdb2dc6ba9ce43a357e38d618ac48c342d975ca2a454bc497f04b09c5dbe65823c430b862ef76” 然后通过这个字符串到VTKDATA9.0.1中去查找:
1
$ grep 7edca2078c26d9647f189353967634c9c4c104b3ef7c81191f1cdb2dc6ba9ce43a357e38d618ac48c342d975ca2a454bc497f04b09c5dbe65823c430b862ef76 *.paxheader
结果:
1
$ 10b64a3c281b0dbb15d798e3ff87dcd770018220.paxheader:169 path=VTK-9.0.1/.ExternalData/SHA512/7edca2078c26d9647f189353967634c9c4c104b3ef7c81191f1cdb2dc6ba9ce43a357e38d618ac48c342d975ca2a454bc497f04b09c5dbe65823c430b862ef76
显然,也即是文件【10b64a3c281b0dbb15d798e3ff87dcd770018220.paxheader】所对应的数据文件就是42400-IDGH.stl
直接把10b64a3c281b0dbb15d798e3ff87dcd770018220.data的文件名改成42400-IDGH.stl,然后再CADPart.py中重新指定文件位置,一切OK!
到这里,VTK的第一部分就基本记录完毕了!