Python版本VTK官⽅⽂档教程学习(⼀)
由于CUDA版本过⾼、某些依赖⽆法安装等种种原因,本⼈在Ubuntu16.04系统中Python环境下只能使⽤VTK库进⾏点云的实时显⽰。⽆奈在⽹上很少看到有Python版本的VTK教学内容,只能耐⼼阅读官⽅⽂档教程进⾏学习。官⽅教程共有六个内容,只是⼀个⼊门级别的简介,但其中很多内容还需⾃⼰查理解,现将内容进⾏记录,希望对各位像我⼀样的新⼿有所帮助。
官⽅⽂档链接如下:
在官⽅⽂档中,除该教程外,还有textbook(557页PDF版本教科书,可以加强理解)、各种类的调⽤介绍以及⼀些例⼦,但是多数为
C++版本,如果在Python模块中没有到,还是参考着C++版本的例⼦进⾏编程。
Tutorial Step1:
教程描述:
创建⼀个多边形棱锥显⽰在屏幕中,并使相机围绕棱锥进⾏360°旋转,随后退出窗⼝。
前情提要:
VTK可视化机制采⽤Pipeline的⽅式。说个题外话,对于Pipeline这个词本⼈⼀直⽆法准确翻译,包括realsense中也有Pipeline。通道?管线?⼤概就是通道的理解⽅式吧,类似⽣产线,按照固定的顺序执⾏完操作后成品。这个Pipeline包括代表数据的数据对象、处理数据的处理对象以及指⽰⽅向的数据流(对象之间的连接箭头)。数据对象表⽰信息,它提供创建、访问和删除此信息的⽅法(没细了解)。处理对象对输⼊的数据进⾏操作以⽣成输出数据,要么从它的输⼊中派⽣出新数据,要么将输⼊数据转换成新的格式。例如处理对象可以从压⼒场或将压⼒场转换为恒值压⼒等值线以⽣成压⼒梯度数据。处理对象可以分为source对象,filter对象,mapper对象等等。Source对象接⼝外部数据源或者通过本地参数⽣成数据。它还可以连接到外部数据通信端⼝和设备,包括模拟、建模或⽤于测温、测压等其它物理属性数据采集系统。Filter对象需要⼀个或多个输⼊数据对象⽣成⼀个或多个输出数据对象,它对数据进⾏各种类似滤波器的算法处理。典型⽰例使计算每周股票市场平均值,将数据值表⽰为缩放图标或对两个输⼊数据源执⾏合并操作。Mapper对象对应于功能模型中的槽,它⽤于终⽌pipeline数据流,通常mapper对象将数据转换为基本图形层,即映射的过程。
VTK程序的典型特征是Source→Mapper→Actor→Renderer→Renderwindow的配置顺序。
Actor策划mapper图形层的渲染,⼀个actor(⾓⾊?演员?)实例代表了⼀个渲染场景中的⼀个对象(⼏何图形及属性)。Renderer类似⼀个视窗,程序将actor分配到每个视窗中最后在Renderwindow中显⽰。其中Renderer是Renderwindow中⼀个或部分窗⼝,即同⼀个渲染窗⼝中可以显⽰多个视窗,
每个视窗中可以承载多个actor,最终实现场景的显⽰。
python官方文档中文版
按照这个顺序,教程中给出了第⼀个段代码,我对需要注意的地⽅增加了注释并翻译了原始注释:
代码:
#!/usr/bin/env python
# noinspection PyUnresolvedReferences
import vtkmodules.vtkInteractionStyle
# noinspection PyUnresolvedReferences
import vtkmodules.vtkRenderingOpenGL2
from vtkmodules.vtkCommonColor import vtkNamedColors
from vtkmodules.vtkFiltersSources import vtkConeSource
from vtkmodules.vtkRenderingCore import (
vtkActor,
vtkPolyDataMapper,
vtkRenderWindow,
vtkRenderer
)
def main(argv):
#
# 创建vtkNamedColors实例,⽤于选择对象和背景的颜⾊
#
colors = vtkNamedColors()
#
# 创建vtkConeSource实例并设定⼀些属性,
# 该source实例通过本地参数⽣成棱锥模型数据。
# VtkConeSource实例“cone”是可视化pipeline的⼀部分。
# 它⽣成⼀些其它filter也许会处理的数据(输出vtkPolyData类型数据)。
# 它⽣成⼀些其它filter也许会处理的数据(输出vtkPolyData类型数据)。
#
cone = vtkConeSource()
cone.SetHeight(3.0)
cone.SetRadius(1.0)
cone.SetResolution(10)
#
# 在⽰例中,我们使⽤mapper进程对象来结束pipeline。
# (中间的filter⽐如vtkShrinkPolyData也许会被插⼊到source和mapper之间)
# 我们创建⼀个实例化的vtkPolyDataMapper去将多边形数据映射到基本图形层中。
# 我们将cone source连接到这个mapper的输⼊
#
coneMapper = vtkPolyDataMapper()  #vtkPolyDataMapper将多边形数据⽐如vtkPolyData映射到基本图形层中。
coneMapper.SetInputConnection(cone.GetOutputPort())  #SetInputConnection为给定的输⼊端⼝索引设置连接,其输⼊是另⼀个filter的输出端⼝,通过GetOutpu    #
# 创建⼀个actor代表cone。actor策划mapper基本图形层的渲染。
# ⼀个actor也通过vtkProperty实例化来改变属性,并包括了⼀个内部变换矩阵。我们设定之前创建的这个actor的mapper为“coneMapper”。
#
coneActor = vtkActor()  # 代表了⼀个渲染场景中的⼀个对象(⼏何图形及属性),vtkActor⽤于表⽰渲染场景中的实体,它继承了vtkProp的actors位姿相关函数。    coneActor.SetMapper(coneMapper)  # 连接⼀个actor到⼀个可视化pipeline的结尾(⽐如mapper)
coneActor.GetProperty().SetColor(colors.GetColor3d('MistyRose'))
#
# 创建⼀个Renderer并将actors分配进去。⼀个renderer就像⼀个视窗,是屏幕中的⼀个或者部分窗⼝,⽤于绘制它拥有的actors。我们也在这⾥设定背景⾊。
#
ren1 = vtkRenderer()
ren1.AddActor(coneActor)
ren1.SetBackground(colors.GetColor3d('MidnightBlue'))
# 最终我们创建render窗⼝,它将显⽰在屏幕中。我们使⽤AddRenderer将renderer放在render窗⼝中。我们也将尺⼨设定在300*300像素⼤⼩。
#
renWin = vtkRenderWindow()
renWin.AddRenderer(ren1)
renWin.SetSize(300, 300)
renWin.SetWindowName('Tutorial_Step1')
#
# 现在我们循环360°,并在每⼀刻渲染cone。
#
for i in range(0, 360):
# 渲染图像
renWin.Render()
# 旋转相机1°,注意:Azimuth是旋转相机的操作,
# 它将使相机绕着以焦点为中⼼,view up⽅向的轴进⾏⾓度旋转,⽽模型不动。
# 其中view up⽅向是⼈为设定的,在世界坐标系下的相机坐标系的Y轴⽅向(在官⽅⽂档中vtkcamera类中的函数中有说明)。
# 关于这部分我也许会在后续相机部分进⾏介绍(如果有需要的话)。
ren1.GetActiveCamera().Azimuth(1)
if __name__ == '__main__':
import sys
main(sys.argv)
效果:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。