中国MOOC《Pyhton计算计算三维可视化》总结
课程url:here ,教师:黄天宇,嵩天
下文的图片和问题,答案都是从eclipse和上完课后总结的,转载请声明。
Python数据三维可视化
1Introduction
1.1可视化计算工具
1.1.1TVTK 科学计算三维可视化基础
Mayavi 三维网格面绘制,三维标量场和矢量场绘制
TraitsUI 交互式三维可视化
SciPy 拟合,线性差值,统计,插值
数据过滤器
需要安装的软件:VTK, Mayavi, numpy, PyQt4, Traits, TraitsUI
1.2内容组织
流体数据的标量可视化、矢量可视化实例
三维扫描数据(模型/地形)
三维地球场景可视化实例
曲线UI交互控制可视化
2基础运用
2.1TVTK入门
科学计算可视化主要方法
二维标量数据场:颜色映射法,等值线法,立体图/层次分割法
三维标量数据场:面绘制法,体绘制法
矢量数据场:直接法,流线法
VTK库安装方法是将文件放在下面,这样系统可以自动检测到并安装,安装在使用如下操作,在开始菜单栏,输入cmd,用管理员身份启动cmd,输入pip install xxx(VTK版本号),有时候安装不行是因为pip需要更新,或者VTK文件放的位置不对,只要根据系统提示正确操作就行。
2.2创建一个基本三维对象
tvtk.CubeSource()的使用代码为s = tvtk.CubeSource(traits)
tvtk中CubeSource()的调用方式:
s = tvtk.CubeSource(x_length=1.0,y_length=2.0,z_length=3.0)
x_length:立方体在X轴的长度
y_length:立方体在Y轴的长度
z_length:立方体在Z轴的长度
以下是s的输出结果:
Debug: Off
Modified Time: 1903583
Reference Count: 2
Registered Events:
Registered Observers:
vtkObserver (000001813DFDB520)
Event: 33
EventName: ModifiedEvent
Command: 000001813DBFDF80
Priority: 0
Tag: 1
Executive: 000001813D838460
ErrorCode: No error
Information: 000001813D864210
AbortExecute: Off
Progress: 0
Progress Text: (None)
X Length: 1
Y Length: 2
Z Length: 3
Center: (0, 0, 0)
Output Points Precision: 0
可以用s.x_length/s.y_length/s.z_length获取长方体在三个方向上的长度。
CubeSource对象的方法
方法
说明
Set/get_x_length()
设置/获取长方体对象在X轴方向的长度
Set/get_y_length()
设置/获取长方体对象在Y轴方向的长度
Set/get_z_length()
设置/获取长方体对象在Z轴方向的长度
Set/get_center()
设置/获取长方体对象所在坐标系的原点
Set/get_bounds()
设置/获取长方体对象的包围盒
TVTK库的基本三维对象
三维对象
说明
CubeSource
立方体三维对象数据源
ConeSource
圆锥三维对象数据源
CylinderSource
圆柱三维对象数据源
ArcSource
圆弧三维对象数据源
ArrowSource
箭头三维对象数据源
比如建立圆锥model,输入
from tvtk.api import tvtk
s = tvtk.ConeSource(height=3.0,radius=1.0,resolution=36)
可以用s.height/s.radius/s.resolution(分辨率)查到高度,半径和分辨率的数据,如果要详细指导所有数据,可以用print(s)命令。
vtkConeSource (000001813DE1E0E0)
Debug: Off
Modified Time: 1903620
Reference Count: 2
Registered Events:
Registered Observers:
vtkObserver (000001813DFDC000)
Event: 33
EventName: ModifiedEvent
Command: 000001813DBFDD40
Priority: 0
Tag: 1
Executive: 000001813D839090
ErrorCode: No error
Information: 000001813D864120
AbortExecute: Off
Progress: 0
Progress Text: (None)
Resolution: 36
Height: 3
Radius: 1
Capping: On
Center: (0, 0, 0)
Direction: (1, 0, 0)
Output Points Precision: 0
2.3显示一个基本三维对象
2.3.1如何利用tvtk绘制三维图形
tvtk使用管线(pipeline)绘制三维图形,其中一下函数
CubeSource(xxx)
PolyDataMapper(xxx)
Actor(xxx)
Renderer(xxx)
RenderWindow(xxx)
RenderWindowInteracotor(xxx)
协作完成管线任务
2.3.2实现一个三维长方体代码
代码例1
from tvtk.api import tvtk
s = tvtk.CubeSource(x_length=1.0,y_length=2.0,z_length=3.0)
m = tvtk.PolyDataMapper(input_connection = s.output_port)
a = tvtk.Actor(mapper=m)
r = tvtk.Renderer(background=(0,0,0))
r.add_actor(a)
w = tvtk.RenderWindow(size=(300,300))
w.add_renderer(r)
i = tvtk.RenderWindowInteractor(render_window = w)
i.initialize()
i.start()
2.4TVTK管线与数据加载
TVTK管线分两部分:数据预处理和图形可视化
数据预处理以s.output_port和m.input_connection形式输出
管线的两种类型:可视化管线(将原始数据加工成图形数据),图形管线(图形数据加工成图像)
可视化管线分两个对象:PolyData(计算输出一组长方形数据)和PolyDataMapper(通过映射器映射为图形数据)
TVTK对象
说明
Actor
场景中一个实体,描述实体位置,方向,大小的属性
Renderer
渲染作用,包括多个Actor
RenderWindow
渲染用的图形窗口,包括一个或多个Render
RenderWindowInteractor
交互功能,评议,旋转,放大缩小,不改变Actor或数据属性,只调整场景中照相机位置
管线的数据可以表示如下:
总结下TVTK管线就分为以下几个部分:数据预处理,数据映射,图形绘制,图形显示与交互
建立长方形模型:
2.4.1IVTK观察管线
代码例2
from tvtk.api importtvtkfrom tvtk.tools importivtkfrom pyface.api importGUI
s= tvtk.CubeSource(x_length=1.0,y_length=2.0,z_length=3.0)
m= tvtk.Actor(mapper=m)
gui=GUI()
win=ivtk.IVTKWithCrustAndBrowser()
win.open()
True
win.scene.add_actor(a)
gui.start_event_loop()
显示结果:
有会出现bug,在主窗口缩放时左侧串口处于游离状态。
Debug程序:
from tvtk.api importtvtkfrom tvtk.tools importivtkfrom pyface.api importGUI
s= tvtk.CubeSource(x_length=1.0,y_length=2.0,z_length=3.0)
m= tvtk.PolyDataMapper(input_connection=s.output_port)
a= tvtk.Actor(mapper=m)
gui=GUI()
win=ivtk.IVTKWithCrustAndBrowser()
win.open()
win.scene.add_actor(a)
dialog=win.control.centralWidget().widget(0).widget(0)from pyface.qt importQtCore
dialog.setWindowFlags(QtCore.Qt.WindowFlags(0x00000000))
dialog.show()
gui.start_event_loop()
Debug后第窗口界面,注意左侧的菜单栏,有分级
Model 建立后,可以在命令框输入代码,获取数据,比如:
输入print(scene.renderer.actors[0].mapper.input.points.to_array),可以得到长方体各个顶点的坐标。
如果要集成开发,可以将函数单独封装,放到python.exe目录下,比如上一个生成长方体的代码可以封装成以下两部分:
主函数
from tvtk.api importtvtkfrom tvtkfunc importivtk_scene,event_loop
s= tvtk.CubeSource(x_length=1.0,y_length=2.0,z_length=3.0)
m= tvtk.PolyDataMapper(input_connection=s.output_port)
a= tvtk.Actor(mapper=m)
win=ivtk_scene(a)
win.scene.isometric_view()
event_loop()
调用函数
defivtk_scene(actors):from tvtk.tools importivtk#创建一个带Crust(Python Shell)的窗口
win =ivtk.IVTKWithCrustAndBrowser()
win.open()
win.scene.add_actor(actors)#修正窗口错误
dialog =win.control.centralWidget().widget(0).widget(0)from pyface.qt importQtCore
dialog.setWindowFlags(QtCore.Qt.WindowFlags(0x00000000))
dialog.show()returnwindefevent_loop():from pyface.api importGUI
gui=GUI()
gui.start_event_loop()
2.4.1Tvtk数据集(TVTK数据加载例1)
Tvtk中有5中数据集:
ImageData表示二维/三维图像的数据结构,有三个参数,spacing,origin,dimensions
from tvtk.api importtvtk
img= tvtk.ImageData(spacing=(1,1,1),origin=(1,2,3),dimensions=(3,4,5))
img.get_point(0)#attain the data of first point
(1.0, 2.0, 3.0)for n in range(6):
...print("%1.f,%1.f,%1.f"%img.get_point(n))
最后得到结果
1,2,3
2,2,3
3,2,3
1,3,3
2,3,3
3,3,3
RectilinearGrid 表示创建间距不均匀的网格,所有点都在正交的网格上通过如下代码构建数据集:
r.y_coordinates =y
r.z_coordinates=z
r.dimensions=len(x),len(y),len(z)
r.x_coordinates=x
r.y_coordinates=y
r.z_coordinates=z
r.dimensions=len(x),len(y),len(z)for n in range(6):
...print(r.get_point(n))
得到数据结果,在轴上数据递增:
(0.0, 0.0, 0.0)
(3.0, 0.0, 0.0)
(9.0, 0.0, 0.0)
(15.0, 0.0, 0.0)
(0.0, 1.0, 0.0)
(3.0, 1.0, 0.0)
StructuredGrid 表示创建任意形状网格,需要指定点的坐标
PolyData 表示由一系列的点、点之间的联系以及由点构成的多边形组成
UnstructuredGrid 无组织网格
TVTK数据集
特点
Imagedata
正交等间距
RectilinearGrid
正交不等间距
StructuredGrid
任意形状网格
PolyData
点和点之间的联系
UnstructuredGrid
无组织点
2.4.3Tvtk读取stl文件
STL文件调用形式:
S = tvtk.STLReader(file_name = “stl文件名”)
文件调用形式
vtkOBJReader()
ply文件调用形式
vtkPLYReader()
调用外部数据
VtkMultiBlockPLOT3DReander()
from tvtk.api importtvtkfrom tvtkfunc importivtk_scene,event_loop
s= tvtk.STLReader(file_name = 'python.stl')
m= tvtk.PolyDataMapper(input_connection =s.output_port)
a= tvtk.Actor(mapper=m)
win=ivtk_scene(a)
win.scene.isometric_view()
event_loop()
Stl格式数据,可以在python三维可视化中打开,也就是说solidworks中创建的stl文件也可以在python三维可视化中打开。
2.4.4Tvtk读取MultiBlock3D数据文件
3D文件读取用MultiBlock数据读取。
网格(XYZ文件),空气动力学结果(Q文件),通用结果文件
源码:但是执行失败,错误类型是tvtk没有定义,或者plot3d没有定义
1. from tvtk.api importtvtk2.3. def read_data():#读入数据
4. plot3d =tvtk.MultiBlockPLOT3DReader(5. xyz_file_name="combxyz.bin",#网格文件
6. q_file_name="combq.bin",#空气动力学结果文件
7. scalar_function_number=100,#设置标量数据数量
8. vector_function_number=200#设置矢量数据数量
9. )10. plot3d.update()11. returnplot3d12.13. plot3d =read_data()14. grid = plot3d.output.get_block(0)
3VTK可视化基础实战
介绍三类可视化方法:标量可视化,矢量可视化,轮廓化可视化
3.1可视化实例
3.1.1标量可视化
等值面:标量值相等的面
Generate_value() 设定N条等值线的值,一般用于重新绘制等值线
Set_value() 设定一条等值线的值,一般用于覆盖某条等值线或者新增加一条等值线
代码例2:绘制流体数据模型的标量场
from tvtk.api importtvtkfrom tvtkfunc importivtk_scene,event_loop
plot3d=tvtk.MultiBlockPLOT3DReader(
... xyz_file_name="combxyz.bin",
... q_file_name="combq.bin",
... scalar_function_number=100,vector_function_number=200)
plot3d.update()
grid=plot3d.output.get_block(0)
con=tvtk.ContourFilter()
con.set_input_data(grid)
con.generate_values(20,grid.point_data.scalars.range)
m= tvtk.PolyDataMapper(scalar_range=grid.point_data.scalars.range,input_connection=con.output_port)
a= tvtk.Actor(mapper=m)
a.property.opacity=0.5win= ivtk_scene(a) #以下3行为交互代码
win.scene.isometric_view()
event_loop()
Generate_values(x,y)两个参数意义:x代表指定轮廓数,y代表数据范围
同样set_values(x,y)中也有同样的两个参数,含义相同,改变这两个参数会改变轮廓数和数据范围
3.1.2矢量可视化
Tvtk.Glyph3D() 符号化技术,可以解决矢量数据可视化问题。
Tvtk.MaskPoints() 降采样
箭头表示标量大小,箭头方向表示矢量方向。
代码例3 矢量化向量
from tvtk.api importtvtkfrom tvtkfunc importivtk_scene,event_loop
plot3d=tvtk.MultiBlockPLOT3DReader(
... xyz_file_name= "combxyz.bin",
... q_file_name= "combq.bin",
... scalar_function_number= 100,vector_function_number = 200)
plot3d.update()
grid=plot3d.output.get_block(0)
mask= tvtk.MaskPoints(random_mode=True,on_ratio=50)
mask.set_input_data(grid)
glyph_source=tvtk.ConeSource()
glyph= tvtk.Glyph3D(input_connection=mask.output_port,scale_factor=4)
glyph.set_source_connection(glyph_source.output_port)
m= vtk.PolyDataMapper(scalar_range=grid.point_data.scalars.range,input_connection=glyph.output_port)
a= tvtk.Actor(mapper =m)
win=ivtk_scene(a)
win.scene.isometric_view()
event_loop()
得到结果:
vtk.Glyph3D() 符号化技术
为了表示矢量数据,TVTK库中运用tvtk.Glyph3D()方法,同时运用MaskPoints()方法进行降维采样。
3.1.3空间轮廓线可视化
需要用到tvtk.StructuredGridOutlineFilter()
Python清空命令行代码函数:
Import osdefclear():
os.system(‘cls’)
clear()
代码例4
from tvtk.api importtvtkfrom tvtk.common importconfigure_inputfrom tvtkfunc importivtk_scene, event_loop
plot3d=tvtk.MultiBlockPLOT3DReader(
xyz_file_name="combxyz.bin",
q_file_name="combq.bin",
scalar_function_number=100, vector_function_number=200)#读入Plot3D数据
plot3d.update()#让plot3D计算其输出数据
grid = plot3d.output.get_block(0)#获取读入的数据集对象
outline = tvtk.StructuredGridOutlineFilter()#计算表示外边框的PolyData对象
configure_input(outline, grid)#调用tvtk.common.configure_input()
m = tvtk.PolyDataMapper(input_connection=outline.output_port)
a= tvtk.Actor(mapper=m)
a.property.color= 0.3, 0.3, 0.3
#窗口绘制
win =ivtk_scene(a)
win.scene.isometric_view()
event_loop()
显示结果
PolyData对象的外边框处理使用了什么方法?
PolyData对象外边框使用了StructuredGridOutlineFilter()的方法。
3.1.4结合矢量可视化和空间轮廓线可视化
对标量/轮廓属性进行赋值,不会处理。
from tvtk.api importtvtkfrom tvtk.common importconfigure_inputfrom tvtkfunc importivtk_scene, event_loop
plot3d=tvtk.MultiBlockPLOT3DReader(
... xyz_file_name= "combxyz.bin",
... q_file_name= "combq.bin",
... scalar_function_number= 100,vector_function_number = 200)
plot3d.update()
grid=plot3d.output.get_block(0)
con=tvtk.ContourFilter()
con.set_input_data(grid)
con.generate_values(20,grid.point_data.scalars.range) #20代表等值面
outline = tvtk.StructuredGridOutlineFilter()#计算表示外边框的PolyData对象
configure_input(outline, grid)#调用tvtk.common.configure_input()
m = tvtk.PolyDataMapper(scalar_range=grid.point_data.scalars.range,input_connection=con.output_port)
m= tvtk.PolyDataMapper(input_connection=outline.output_port)
a= tvtk.Actor(mapper=m)
a.property.color= 0.3, 0.3, 0.3a.property.opacity=0.5win= ivtk_scene(a) #以下3行为交互代码
win.scene.isometric_view()
event_loop()
3.2TVTK库实战练习
练习1:用tvtk绘制一个圆锥,圆锥的数据源对象为ConeSource(),圆锥高度为6.0,圆锥半径为2.0,背景色为红色。
代码例5
from tvtk.api importtvtkfrom tvtk.tools importivtkfrom pyface.api importGUI
s= tvtk.ConeSource(height=6.0,radius=1.0,resolution=36)
m= tvtk.PolyDataMapper(input_connection=s.output_port)
a= tvtk.Actor(mapper=m)
gui=GUI()
win=ivtk.IVTKWithCrustAndBrowser()
win.open()
win.scene.add_actor(a)
dialog=win.control.centralWidget().widget(0).widget(0)from pyface.qt importQtCore
dialog.setWindowFlags(QtCore.Qt.WindowFlags(0x00000000))
dialog.show()
gui.start_event_loop()
代码例6
from tvtk.api importtvtk
s= tvtk.ConeSource(height=6.0,radius=2.0,resolution=36)
m= tvtk.PolyDataMapper(input_connection=s.output_port)
a= tvtk.Actor(mapper=m)
r= tvtk.Renderer(backgr