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在线帮助文档可以根据版本下载到本地

    • VTK Users邮件列表

    • VTK论坛

    • VTK Examples

    • 其他

    • 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, 这个在应用中,一般好会自己来封装,比如用QT

      Python的简单代码

      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
      29
      import 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.00.40.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的第一部分就基本记录完毕了!