1. VTK简介
可视化工具包(VTK: The Visualization Toolkit)是一个开源的、免费的软件系统,用于计算机三维图形、建模、图像处理、体绘制、科学可视化和2D绘图。它支持各种可视化算法和高级建模技术,并分别利用线程和分布式内存并行处理的速度和可伸缩性。
VTK支持多平台运行,可以在Linux、Windows、Mac、Web和移动设备上运行。
2. 动手学VTK
2.1 安装
如果你在使用Anaconda:打开Anaconda Prompt (Anaconda3),激活你要安装的环境后安装vtk
conda install vtk
也可使用pip安装vtk
pip install vtk
2.2 VTK流程简介
绘制几何体的流程:
- Source/Data:创建内容,需要可视化的几何体等
- Mapper:映射器,把vtk的数据传给openGL
- Actor:把前面准备的几何体造出来
- Render:将图形渲染出来,在窗口中展示出来
- Window:设置对应窗口的操作,比如旋转
- Interactor:与窗口的交互设置
绘制图片的流程:
- Reader:读入图片
- Filter:对图像进行处理
- Viewer:展示处理过的图片
vtk的pipeline的实现是通过对前一步的对象拷贝得到的,因此很容易占内存。在执行到Write() 或者 Render()之前,所显示的图像是不会更新的。每个类都会带有一个Update()可以强迫这个类的数据进行更新。由此可见vtk的整个流程并不是像flow一样,而是一层一层拷贝而来的。
2.3 官网示例
A hello world example(来自VTK教科书和源代码的圆柱体实例)
PS: 至于为什么叫hello world,我猜可能是代表入门/你跑的第一个VTK代码的意思,同第一次学习编程语言都是从print("Hello, world! ")开始的
#!/usr/bin/env python
# 这个例子创建了一个最小的可视化程序,演示了 VTK 的基本渲染和管道创建。
# noinspection PyUnresolvedReferences
import vtkmodules.vtkInteractionStyle
# noinspection PyUnresolvedReferences
import vtkmodules.vtkRenderingOpenGL2
from vtkmodules.vtkCommonColor import vtkNamedColors
from vtkmodules.vtkFiltersSources import vtkCylinderSource
from vtkmodules.vtkRenderingCore import (
vtkActor,
vtkPolyDataMapper,
vtkRenderWindow,
vtkRenderWindowInteractor,
vtkRenderer
)
def main():
# ---------------数据准备-----------------
colors = vtkNamedColors()
# 设置背景颜色
bkg = map(lambda x: x / 255.0, [26, 51, 102, 255])
colors.SetColor("BkgColor", *bkg)
# 创建一个有八个面的多边形圆柱体模型
cylinder = vtkCylinderSource()
cylinder.SetResolution(8)
# -----------------映射-------------------
# 映射器(mapper)将几何体放入图形库,也可以做颜色映射
cylinderMapper = vtkPolyDataMapper()
cylinderMapper.SetInputConnection(cylinder.GetOutputPort())
# ------actor是一个分组机制:除了几何(映射器),它还具有属性、变换矩阵和/或纹理映射
# ----------------这里我们设置它的颜色并旋转-22.5度------------
# 添加绘制对象
cylinderActor = vtkActor()
# 绘制对象添加映射器
cylinderActor.SetMapper(cylinderMapper)
cylinderActor.GetProperty().SetColor(colors.GetColor3d("Tomato"))
cylinderActor.RotateX(30.0)
cylinderActor.RotateY(-45.0)
# ----------创建图形结构。渲染器(renderer)呈现到渲染窗口中。---------
# ----------渲染窗口交互器捕获鼠标的动作,并执行相应操作。------------
# 添加绘制器
ren = vtkRenderer()
# 添加绘制窗口
renWin = vtkRenderWindow()
renWin.AddRenderer(ren)
iren = vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)
# 绘制器添加对象,设置背景和尺寸大小
ren.AddActor(cylinderActor)
ren.SetBackground(colors.GetColor3d("BkgColor"))
renWin.SetSize(300, 300)
renWin.SetWindowName('CylinderExample')
# --------------------交互器初始化--------------------------
iren.Initialize()
# 通过访问相机并调用"Zoom"来放大
ren.ResetCamera()
ren.GetActiveCamera().Zoom(1.5)
renWin.Render()
# 交互器启动
iren.Start()
if __name__ == '__main__':
main()
Reference:
[1] VTK - The Visualization Toolkit
[2] vtk学习笔记 - 简书