python三维转换教程_Python科学计算三维可视化【完结】

中国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

你可能感兴趣的:(python三维转换教程)