1. vtk简介
VTK全称Visualization ToolKit,是一个开源的计算机图形学工具,可以用来实现图像处理和可视化、建模等。
2. vtk流程
绘制几何体的流程:
-
Source/Data:创建内容,需要可视化的几何体等
-
Mapper:把vtk的数据传给openGL
-
Actor:把前面准备的几何体造出来
-
Render:将图形渲染出来,在窗口中展示出来
-
Window:设置对应窗口的操作,比如旋转
-
Interactor:与窗口的交互设置
绘制图片的流程:
- Reader:读入图片
- Filter:对图像进行处理
- Viewer:展示处理过的图片
vtk的pipeline的实现是通过对前一步的对象拷贝得到的,因此很容易占内存。在执行到Write() 或者 Render()之前,所显示的图像是不会更新的。每个类都会带有一个Update()可以强迫这个类的数据进行更新。由此可见vtk的整个流程并不是像flow一样,而是一层一层拷贝而来的。
3. vtk代码例子
官网例子
import vtk
def main():
# 颜色类:包括了283种预设的颜色
colors = vtk.vtkNamedColors()
# 设置背景颜色
bkg = map(lambda x: x / 255.0, [26, 51, 102, 255])
colors.SetColor("BkgColor", *bkg)
# 创建一个有八个面的多边形圆柱
cylinder = vtk.vtkCylinderSource()
cylinder.SetResolution(8)
# mapper 将集合体放入图形库里
# 也可以做颜色映射
cylinderMapper = vtk.vtkPolyDataMapper()
cylinderMapper.SetInputConnection(cylinder.GetOutputPort())
coneMapper = vtk.vtkPolyDataMapper()
coneMapper.SetInputConnection(cone.GetOutputPort())
# actor 的作用大概是把将几何体mapper,颜色和变换等组合在一起
cylinderActor = vtk.vtkActor()
cylinderActor.SetMapper(cylinderMapper)
cylinderActor.GetProperty().SetColor(colors.GetColor3d("Tomato"))
cylinderActor.RotateX(30.0)
cylinderActor.RotateY(-45.0)
# 创建并渲染图形结构
# 渲染窗口会交互器捕捉鼠标事件
ren = vtk.vtkRenderer()
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(ren)
iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)
# 将actors 加入渲染器, 并设置窗口的背景和大小
ren.AddActor(cylinderActor)
ren.AddActor(coneActor)
ren.SetBackground(colors.GetColor3d("BkgColor"))
renWin.SetSize(300, 300)
renWin.SetWindowName('CylinderExample')
# interactor可以初始化自己,但必须在事件循环之前调用。
iren.Initialize()
# 缩放相机
ren.ResetCamera()
ren.GetActiveCamera().Zoom(1.5)
renWin.Render()
# 开始事件循环
iren.Start()
if __name__ == '__main__':
main()
圆柱体
对物体进行360旋转,需要每秒对物体旋转一个角度并渲染出来:
for i in range(0, 360):
# Render the image.
renWin.Render()
# Rotate the active camera by one degree.
ren.GetActiveCamera().Azimuth(1)
想要同时展示两个物体并且分两个窗口,需要创建两个renderer并把对应的actor分配给他们,SetViewport必需的,不然会出现显示不出来的情况。
ren1 = vtk.vtkRenderer()
ren1.AddActor(coneActor)
ren1.SetBackground(colors.GetColor3d('RoyalBlue'))
ren1.SetViewport(0.0, 0.0, 0.5, 1.0)
ren2 = vtk.vtkRenderer()
ren2.AddActor(cylinderActor)
ren2.SetBackground(colors.GetColor3d('DodgerBlue'))
ren2.SetViewport(0.5, 0.0, 1.0, 1.0)
显示两个
也可以将多个actor与同一个render连接:
ren1 = vtk.vtkRenderer()
ren1.AddActor(coneActor)
ren1.AddActor(coneActor2)
ren1.SetBackground(colors.GetColor3d("CornflowerBlue"))
网友评论