Python vtk学习(1)
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)的更多相关文章
- 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL
周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...
- 60分钟Python快速学习(给发哥一个交代)
60分钟Python快速学习 之前和同事谈到Python,每次下班后跑步都是在听他说,例如Python属于“胶水语言啦”,属于“解释型语言啦!”,是“面向对象的语言啦!”,另外没有数据类型,逻辑全靠空 ...
- python爬虫学习(1) —— 从urllib说起
0. 前言 如果你从来没有接触过爬虫,刚开始的时候可能会有些许吃力 因为我不会从头到尾把所有知识点都说一遍,很多文章主要是记录我自己写的一些爬虫 所以建议先学习一下cuiqingcai大神的 Pyth ...
- python爬虫学习 —— 总目录
开篇 作为一个C党,接触python之后学习了爬虫. 和AC算法题的快感类似,从网络上爬取各种数据也很有意思. 准备写一系列文章,整理一下学习历程,也给后来者提供一点便利. 我是目录 听说你叫爬虫 - ...
- Python正则表达式学习摘要及资料
摘要 在正则表达式中,如果直接给出字符,就是精确匹配. {m,n}? 对于前一个字符重复 m 到 n 次,并且取尽可能少的情况 在字符串'aaaaaa'中,a{2,4} 会匹配 4 个 a,但 a{2 ...
- python 线程学习
彩照 一.学习[1] # -*- coding: utf-8 -*- import time import thread def timer(no, interval): cnt = 0 while ...
- Openstack python api 学习文档 api创建虚拟机
Openstack python api 学习文档 转载请注明http://www.cnblogs.com/juandx/p/4953191.html 因为需要学习使用api接口调用openstack ...
- !!对python列表学习整理列表及数组详细介绍
1.Python的数组分三种类型:(详细见 http://blog.sina.com.cn/s/blog_6b783cbd0100q2ba.html) (1) list 普通的链表,初始化后可以通过特 ...
- Python实战:Python爬虫学习教程,获取电影排行榜
Python应用现在如火如荼,应用范围很广.因其效率高开发迅速的优势,快速进入编程语言排行榜前几名.本系列文章致力于可以全面系统的介绍Python语言开发知识和相关知识总结.希望大家能够快速入门并学习 ...
随机推荐
- CSS的六大选择器
选择器:选择器是一种模式,用于选择需要添加样式的元素. 首先简述六大选择器 基本选择器 标签选择器 类选择器 ID选择器 高级选择器 层次选择器 结构伪类选择器 属性选择器 其中基本选择器与层次选择器 ...
- xpath获取一个标签下的多个同级标签
一.问题: 我在使用xpath获取文章内容的时候会遇到,多个相同的标签在同一级下面,但是我们只需要获取一部分的内容.比如我不想需要原标题这些内容. 二.解决: Xpath中有一个position()的 ...
- jquery如何在元素后面添加一个元素
jQuery添加插入元素技巧: jquery添加分为在指定元素的里面添加和外面添加两种: 里面添加使用(append 和prepend) 里面添加又分为在里面的前面添加和后面添加 里面的前面添加使用 ...
- ABP框架系列之十六:(Dapper-Integration-Dapper集成)
Introduction Dapper is an object-relational mapper (ORM) for .NET. Abp.Dapper package simply integra ...
- modbus转乐鑫物联网平台上传工具
乐鑫平台推荐个人用户使用 界面比较简洁
- STM32F1xx寄存器版库
文件下载链接 https://files.cnblogs.com/files/listenscience/STM32F1xx%28MDK5%292018.10.20.rar
- C程序编程规范一
和身边一些学弟们接触发现他们的编程习惯不是太好,对一些基本的规范不重视,今天有时间写一些基本的规范给一些刚入门的新手们,高手可忽略. 首先做项目来说需要建立工程,一般需要几个到几百个上上千个C文件,这 ...
- Centos yum 修改为阿里源以及常用的命令
1.备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2.下载新的CentOS-Base ...
- [UWP]如何实现UWP平台最佳图片裁剪控件
前几天我写了一个UWP图片裁剪控件ImageCropper(开源地址),自认为算是现阶段UWP社区里最好用的图片裁剪控件了,今天就来分享下我编码的过程. 为什么又要造轮子 因为开发需要,我们需要使用一 ...
- java之LinkedList详细介绍
1 LinkedList介绍 LinkedList简介 LinkedList 是一个继承于AbstractSequentialList的双向链表.它也可以被当作堆栈.队列或双端队列进行操作.Linke ...