简单介绍一下vtk。(个人理解,如果想看更专业的解释,请去官网)
如果你想用代码画一个图像(2D或者3D),你会怎么做?
首先你要确认,这个所谓的图像,肯定是由点来构成的,你可以画出很多很多的点,然后就可以呈现出线段,进而2D或者3D图像。
那么画点,你要确认点的形状(锥体,球体,正方体等),然后把这个点放到一个位置pos,然后如法炮制,放其他很多很多你创造出的点。
那么你该怎么画点咧?
在vtk中,
points_list=[[1,0,0],[0,0,1],[0,0,0]]
points=vtk.vtkPoints()
vertices=vtk.vtkCellArray()
for i in points_list:
point_id=points.InsertNextPoint(i)
vertices.InsertNextCell(1)
vertices.InsertCellPoint(point_id)
在vtk中,上面的几行代码就可以创造三个点,位置分别是(1,0,0)(0,0,1)(0,0,0)
总结来了:
vtk就是一个函数库,你可以通过一些接口(就是 vtk.vtkPoints()这些函数),来做一些你想要完成的代码(画点,画线,画体),顺便补充一下,vtk的底层是用opengl来封装的,如果vtk学的差不多了的话,你可以向底层的opengl进军。
那么现在就开始我们的第一个vtk代码demo吧。
首先我先说明下我的版本:
编译器:pycharm
python环境:python3.6
vtk版本:9.0.1(不同版本的接口函数可能会有差异)
那么,直接上代码(建议直接ctrl+c ctrl+v),结果图也如下
# -*- coding: utf-8 -*-
# !/usr/bin/env python
import vtk
points_list=[[1,0,0],[0,0,1],[0,0,0]]
# 遍历已知点列表,将点信息赋给vtkPoints vtkCellArray
# 建立点和点之间的拓扑关系,点的坐标
points=vtk.vtkPoints()
vertices=vtk.vtkCellArray()
for i in points_list:
point_id=points.InsertNextPoint(i)
vertices.InsertNextCell(1)
vertices.InsertCellPoint(point_id)
# 创建拓扑关系 数据和拓扑,标量矢量信息均在其中
polydata=vtk.vtkPolyData()
polydata.SetPoints(points)
polydata.SetVerts(vertices)
# 创建vtk数据结构
# 数据映射,做显示用
mapper=vtk.vtkPolyDataMapper()
mapper.SetInputData(polydata)
# 创建演员
# 数据及各种属性封装至vtkActor() —— 演员,此时它具备显示的条件——走上“舞台”,是vtk显示机制分水岭对象!
actor=vtk.vtkActor()
actor.SetMapper(mapper)
actor.GetProperty().SetPointSize(10)
actor.GetProperty().SetColor(0.0,1.0,0.0)
# 添加坐标轴 并设置坐标轴长度
# 其实就是演员,可以理解为:多个演员,可以通过相同或者不同的渲染器,在同一个舞台上表演
axes_actor = vtk.vtkAxesActor()
axes_actor.SetTotalLength(2, 2, 2)
# 创建渲染器
# 渲染器vtkRenderer() —— 舞台有了,需要显示“演员”,提供关键属性包括背景色、相机Camera、光照Light等。
ren=vtk.vtkRenderer()
ren.SetBackground(0.8,0.3,0.8)
ren.SetBackground(0.3,0.5,0.9)
ren.SetGradientBackground(1)
ren.AddActor(actor)
ren.AddActor(axes_actor)
# 创建舞台
# 显示窗口vtkRenderWindow() —— 提供“舞台”,实质是win32OpenGL对数据显示
ren_window=vtk.vtkRenderWindow()
ren_window.SetWindowName('axiong first cube')
ren_window.SetSize(300,300)
ren_window.AddRenderer(ren)
# 创建交互方式
# 和舞台绑定,可以用鼠标移动来观看不同方式的三位模型(演员和演员之间的关系)
# 一切具备需要“观众”vtkRenderWindowInteractor() —— 事件交互,如切换视角、鼠标选取“演员”、启动显示引擎。
interactor=vtk.vtkRenderWindowInteractor()
interactor.SetRenderWindow(ren_window)
# interactor = ren_window.GetInteractor()
# 交互采用的模式
# 这里采用的是移动相机模式,其他多种交互模式可百度
style=vtk.vtkInteractorStyleMultiTouchCamera()
interactor.SetInteractorStyle(style)
# 启动显示三部曲:初始化 渲染 启动
interactor.Initialize()
ren_window.Render()
interactor.Start()
详细代码就不解释了,更何况里边的注释也蛮详细的。
如果有那些地方不懂的话,你可以注释掉跑一跑。
总结一下vtk代码流程(我自己做笔记用,方便温习):
1:调用vtk接口创建点,并将其实例化
2:创建polydata ,把实例化的points和vertices装进去
3:创建mapper,把polydata装进去
4:创建actor,把mapper装进去
5:创建ren,把actor装进去
6:创建ren_window,把ren装进去
7:交互方式interactor,用来和ren_window联系(最重要)
8:三部曲:初始化,渲染,启动
粘一些从别的地方看到的: