Vtk,(visualization toolkit)是一个开源的免费软件系统,主要用于三维计算机图形学、图像处理和可视化。Vtk是在面向对象原理的基础上设计和实现的,它的内核是用C++构建的,包含有大约250,000行代码,2000多个类,还包含有几个转换界面,因此也可以自由的通过Java,Tcl/Tk和Python各种语言使用vtk。以下介绍VTK对于STL图像的基本操作

基础概念

数据源 resource: cone = vtk.vtkConeSource()

映射器 mapper:coneMapper = vtk.vtkPolyDataMapper()

映射器添加数据源: coneMapper.SetInput( cone.GetOutput() )

演员 actor: coneActor = vtk.vtkActor()

演员添加映射器:coneActor.SetMapper( coneMapper )

绘制器 renderer: vtk.vtkRenderer()

绘制器添加演员:renderer.AddActor( coneActor )

绘制窗口 win:vtk.vtkRenderWindow()

绘制窗口添加绘制器:renWin.AddRenderer( renderer )

窗口读取绘制器生成的图形: renWin.Render()

极简示例

import vtk

# 箭头源
arrow_source = vtk.vtkArrowSource()
# 映射器
mapper = vtk.vtkPolyDataMapper()
# 映射器添加数据源
mapper.SetInputConnection(arrow_source.GetOutputPort())
# 演员
actor = vtk.vtkActor()
# 演员添加映射器
actor.SetMapper(mapper)
# 绘制器
ren = vtk.vtkRenderer()
# 绘制器添加演员
ren.AddActor(actor)
# 绘制窗口
renWin = vtk.vtkRenderWindow()
# 绘制窗口添加绘制器
renWin.AddRenderer(ren)
# 创建窗口交互器
iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)
iren.Initialize()
# 窗口读取绘制器生成的图形
renWin.Render()
iren.Start()

结果

读取文件

文件类型 读取方法
STL vtkSTLReader()
SLC vtkSLCReader()
VTP vtkXMLPolyDataReader()
UnstructuredGrid vtkNamedColors()
ExodusData vtkExodusIIReader()

示例

def read_data(file_name):
reader = vtk.vtkSTLReader()
reader.SetFileName(file_name)
return reader

图像旋转

绕()轴旋转 方法
X actor.RotateX(angle)
Y actor.RotateY(angle)
Z actor.RotateZ(angle)

整体旋转

transform.RotateWXYZ(angle, x, y, z)

x,y,z旋转(0,1)表示是否旋转

import vtk

arrow_source = vtk.vtkArrowSource()
mapper = vtk.vtkPolyDataMapper() transform = vtk.vtkTransform()
transform.RotateWXYZ(90, 0, 0, 1)
transformFilter = vtk.vtkTransformPolyDataFilter()
transformFilter.SetTransform(transform)
transformFilter.SetInputConnection(arrow_source.GetOutputPort())
transformFilter.Update()
mapper.SetInputConnection(transformFilter.GetOutputPort()) actor = vtk.vtkActor()
actor.SetMapper(mapper)
ren = vtk.vtkRenderer()
ren.AddActor(actor)
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(ren)
renWin.Render()
iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)
iren.Initialize()
renWin.Render()
iren.Start()

结果

设置演员初始方向

def set_origin(actor, x, y, z):
actor.SetOrientation(x, y, z)

缩放

def set_scale(x, y, z):
actor.SetScale(x, y, z)

平移

def add_position(x, y, z):
actor.AddPosition(x, y, z)

平面切割

def cut(file_name):
reader = read_data(file_name) # 定义切割平面
clipPlane = vtk.vtkPlane()
clipPlane.SetNormal(1.0, -1.0, -1.0)
clipPlane.SetOrigin(0.0, 0.0, 0.0) # 平面切割三维数据
clipper = vtk.vtkClipPolyData()
clipper.SetInputConnection(reader.GetOutputPort())
clipper.SetClipFunction(clipPlane)
clipper.InsideOutOn() # ? # 定义mapper和actor
superMapper = vtk.vtkPolyDataMapper()
superMapper.SetInputConnection(clipper.GetOutputPort())
superActor = vtk.vtkActor()
# 设置偏转角度
set_origin(superActor, -50, -75, 120)
superActor.SetMapper(superMapper)
superActor.GetProperty().SetColor(colors.GetColor3d("Cyan"))
only_show(superActor)

原始图片

平面切割后图片

鼠标事件监听

# 监听事件
class MyEvent(vtk.vtkInteractorStyleTrackballCamera): def __init__(self, parent=None):
self.AddObserver("MiddleButtonPressEvent", self.middle_button_press_event)
self.AddObserver("MiddleButtonReleaseEvent", self.middle_button_release_event)
self.AddObserver("LeftButtonPressEvent", self.left_button_press_event)
self.AddObserver("LeftButtonReleaseEvent", self.left_button_release_event)
self.AddObserver("RightButtonPressEvent", self.right_button_press_event)
self.AddObserver("RightButtonReleaseEvent", self.right_button_release_event) def middle_button_press_event(self, obj, event):
print("Middle Button pressed")
self.OnMiddleButtonDown()
return def middle_button_release_event(self, obj, event):
print("Middle Button released")
self.OnMiddleButtonUp()
return def left_button_press_event(self, obj, event):
print("Left Button pressed")
self.OnLeftButtonDown()
return def left_button_release_event(self, obj, event):
print("Left Button released")
self.OnLeftButtonUp()
return def right_button_press_event(self, obj, event):
print("right Button pressed")
self.OnRightButtonDown()
return def right_button_release_event(self, obj, event):
print("right Button released")
self.OnLeftButtonUp()
return # 引入上一段代码调用
iren.SetInteractorStyle(MyEvent())

结果

参考文档

Python VTK Example

计算机图形学-vtk-python学习笔记(初级篇)

VTK笔记——模型的空间变换(Transform).平移、旋转和缩放

Python vtk学习(1)的更多相关文章

  1. 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL

    周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...

  2. 60分钟Python快速学习(给发哥一个交代)

    60分钟Python快速学习 之前和同事谈到Python,每次下班后跑步都是在听他说,例如Python属于“胶水语言啦”,属于“解释型语言啦!”,是“面向对象的语言啦!”,另外没有数据类型,逻辑全靠空 ...

  3. python爬虫学习(1) —— 从urllib说起

    0. 前言 如果你从来没有接触过爬虫,刚开始的时候可能会有些许吃力 因为我不会从头到尾把所有知识点都说一遍,很多文章主要是记录我自己写的一些爬虫 所以建议先学习一下cuiqingcai大神的 Pyth ...

  4. python爬虫学习 —— 总目录

    开篇 作为一个C党,接触python之后学习了爬虫. 和AC算法题的快感类似,从网络上爬取各种数据也很有意思. 准备写一系列文章,整理一下学习历程,也给后来者提供一点便利. 我是目录 听说你叫爬虫 - ...

  5. Python正则表达式学习摘要及资料

    摘要 在正则表达式中,如果直接给出字符,就是精确匹配. {m,n}? 对于前一个字符重复 m 到 n 次,并且取尽可能少的情况 在字符串'aaaaaa'中,a{2,4} 会匹配 4 个 a,但 a{2 ...

  6. python 线程学习

    彩照 一.学习[1] # -*- coding: utf-8 -*- import time import thread def timer(no, interval): cnt = 0 while ...

  7. Openstack python api 学习文档 api创建虚拟机

    Openstack python api 学习文档 转载请注明http://www.cnblogs.com/juandx/p/4953191.html 因为需要学习使用api接口调用openstack ...

  8. !!对python列表学习整理列表及数组详细介绍

    1.Python的数组分三种类型:(详细见 http://blog.sina.com.cn/s/blog_6b783cbd0100q2ba.html) (1) list 普通的链表,初始化后可以通过特 ...

  9. Python实战:Python爬虫学习教程,获取电影排行榜

    Python应用现在如火如荼,应用范围很广.因其效率高开发迅速的优势,快速进入编程语言排行榜前几名.本系列文章致力于可以全面系统的介绍Python语言开发知识和相关知识总结.希望大家能够快速入门并学习 ...

随机推荐

  1. 201621123002《JAVA程序设计》第三章学习总结

    1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词,如类.对象.封装等 关键词:类 对象 封装 构造函数 this,static,final 1.2 用思维导图或者Onenote或 ...

  2. leveldb 学习记录(八) compact

    随着运行时间的增加,memtable会慢慢 转化成 sstable. sstable会越来越多 我们就需要进行整合 compact 代码会在写入查询key值 db写入时等多出位置调用MaybeSche ...

  3. Chapter3_操作符_算术操作符

    java中的算术操作符与其它语言并无太大区别,常用到的是以下这些: (1)加号(+),减号(-),除号(\),乘号(*),取模操作符(%),其中除号需要特别注意的是,会自动截取掉小数点后面的部分,而不 ...

  4. 响应式---web设计之CSS3 Media Queries

    一:设置视口  (view [vju:] 看; ==看待  port [pɔ:t] 接口)==视口 <meta name="viewport" content="w ...

  5. Reading | 《C++ Primer Plus》(未完待续)

    目录 一.概述和C++简史 1.早期语言的问题 2.面向对象编程OOP 3.泛型编程 二.入门 1.头文件 2.名称空间 3.cout输出 4.C++语句 5.函数 一.概述和C++简史 C++融合了 ...

  6. noi2015品酒大会(sa)

    用常用的套路,排序之后从大到小插入height,用并查集维护即可. #include<iostream> #include<cstring> #include<cstdi ...

  7. ReSharper 10.0.0.2 Ultimate 破解

    文件下载地址:http://pan.baidu.com/s/1gf7l8cF 1.安装ReSharper 10.0.0.2 Ultimate 2.修改Products.json文件的FilePath, ...

  8. ASP.NET WebApi JObject 使用

    ASP.NET WebApi 中使用非Get请求,传递参数需要用对象包裹起来,比如: [HttpPost] public async Task<IActionResult> PostVal ...

  9. Programming Specification

    1. Define variable return_code to record the function's status. int return_code = 0; 2. Define the e ...

  10. 「WC2018」州区划分(FWT)

    「WC2018」州区划分(FWT) 我去弄了一个升级版的博客主题,比以前好看多了.感谢 @Wider 不过我有阅读模式的话不知为何 \(\text{LATEX}\) 不能用,所以我就把这个功能删掉了. ...