【学习笔记】Python科学计算三维可视化(黄天羽、嵩天)(学习中。。)

0 导学

目的: 掌握利用三维效果表达科学和工程数据的能力

传播一种思想: 可视化技术是数据之眼

内容组织:

流体数据的标量可视化、矢量可视化实例

三维扫描数据(模型/地形)可视化实例

三维地球场景可视化实例

曲线UI交互控制可视化实例

1 基础运用

科学计算可视化的主要方法:

二维标量数据场:颜色映射法、等值线方法、立体图法和层次分割法

三维标量数据场:面绘制方法、体绘制方法

矢量数据场:直接法(箭头、线段、色轮等手段表示矢量数据)、流线法

应用领域:地球科学、大气科学、医学/生命科学、生物/分子科学、航空/航天/工业、化工/化学、物理/力学、人类/考古、地址勘探等

1.1 TVTK入门

TVTK库是在标准VTK库之上用traits进行了封装,因此可以查看VTK库文档https://vtk.org/doc/nightly/html/annotated.html

TVTK库中类名去除了前缀vtk

函数名按照Python惯例,采用下划线连接单词,如AddItem->add_item

VTK对象的方法在TVTK中用Trait属性替代,例如VTK中m.SetInputConnection(c.GetOutputPort()),TVTK中m.input_connection(c.output_port)

安装:

conda install vtk

conda install numpy

conda install traits

conda install mayavi

conda install PyQt

或者从https://www.lfd.uci.edu/~gohlke/pythonlibs/下载对应用whl文件pip安装

安装完测试下

【学习笔记】Python科学计算三维可视化(黄天羽、嵩天)(学习中。。)

bash;gutter:true; from tvtk.tools import tvtk_doc tvtk_doc.main()</p> <pre><code> ;gutter:true;
In[3]: from tvtk.api import tvtk
In[4]: s = tvtk.CubeSource(x_length=1.0,y_length=2.0,z_length=3.0)
In[5]: print(s)
vtkCubeSource (000001A7ACDECA70)
Debug: Off
Modified Time: 132
Reference Count: 2
Registered Events:
Registered Observers:
vtkObserver (000001A7B0699C20)
Event: 33
EventName: ModifiedEvent
Command: 000001A7B097C560
Priority: 0
Tag: 1
Executive: 000001A7B0418800
ErrorCode: No error
Information: 000001A7AD8034D0
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 = tvtk.CubeSource(traits)

s表示对象变量,返回一个三维对象实例

tvtk.CubeSource是一个构造函数,构造具有一定traits属性的长方体数据源对象

什么是traits,英文意思的属性,由于python变量没有类型,导致实际操作中遇到了些不便利,traits库可以为python添加类型定义,由于tvtk正是在vtk上用traits库进行的封装形式,为了更简单的理解, 我们可以认为traits就是tvtk对象的属性

【学习笔记】Python科学计算三维可视化(黄天羽、嵩天)(学习中。。)

【学习笔记】Python科学计算三维可视化(黄天羽、嵩天)(学习中。。)

bash;gutter:true; In[3]: from tvtk.api import tvtk In[4]: s = tvtk.ConeSource(height=3.0,radius=1.0,resolution=36) In[5]: s.height Out[5]: 3.0 In[6]: s.radius Out[6]: 1.0 In[7]: s.resolution Out[7]: 36 In[8]: s.center Out[8]: array([0., 0., 0.]) In[9]: print(s) vtkConeSource (000002CC5566E290) Debug: Off Modified Time: 134 Reference Count: 2 Registered Events: Registered Observers: vtkObserver (000002CC572346C0) Event: 33 EventName: ModifiedEvent Command: 000002CC573449D0 Priority: 0 Tag: 1 Executive: 000002CC56FFA700 ErrorCode: No error Information: 000002CC5722B540 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</p> <pre><code> #### 显示一个三维对象 ![【学习笔记】Python科学计算三维可视化(黄天羽、嵩天)(学习中。。)](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230602/1393680-20191217084849626-1232757789.png) ;gutter:true;
from tvtk.api import tvtk

创建一个长方体数据源,并且同时设置其长宽高
s = tvtk.CubeSource(x_length=1.0, y_length=2.0, z_length=3.0)
使用PolyDataMapper将数据转换为图形数据
m = tvtk.PolyDataMapper(input_connection=s.output_port)
创建一个Actor
a = tvtk.Actor(mapper=m)
创建一个Renderer,将Actor添加进去
r = tvtk.Renderer(background=(0, 0, 0))
r.add_actor(a)
创建一个RenderWindow(窗口),将Renderer添加进去
w = tvtk.RenderWindow(size=(300, 300))
w.add_renderer(r)
创建一个RenderWindowInteractor(窗口的交互工具)
i = tvtk.RenderWindowInteractor(render_window=w)
开启交互
i.initialize()
i.start()

将长方体数据转化为三维图像运用了什么技术?

管线(Pipeline),对象之间协调完成工作的过程,需要众多的的TVTK对象共同协调完成,如tvtk.CubeSource、tvtk.PolyDataMapper、tvtk.Actor、tvtk.Renderer、tvtk.RenderWindow、tvtk.RenderWindowInteractor

1.2 TVTK管线与数据加载

管线基本流程

【学习笔记】Python科学计算三维可视化(黄天羽、嵩天)(学习中。。)

几乎所有渲染引擎都会涉及管线技术,TVTK管线分为2部分,其中:

可视化管线:将原始数据加工为图形数据的过程

【学习笔记】Python科学计算三维可视化(黄天羽、嵩天)(学习中。。)

【学习笔记】Python科学计算三维可视化(黄天羽、嵩天)(学习中。。)

IVTK工具观察管线

bash;gutter:true; from tvtk.api import tvtk from tvtk.tools import ivtk from pyface.api import GUI</p> <p>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)</p> <h1>创建一个带Crust(Python Shell)的窗口</h1> <p>gui = GUI() win = ivtk.IVTKWithCrustAndBrowser() win.open() win.scene.add_actor(a)</p> <h1>开始界面消息循环</h1> <p>gui.start_event_loop()</p> <pre><code> 由于版本过高,from tvtk.tools import ivtk,这句出现错误。。。 ![【学习笔记】Python科学计算三维可视化(黄天羽、嵩天)(学习中。。)](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230602/1393680-20191219152356983-704680528.png) #### TVTK数据集 数据集,包括点与数据,点之间有连接和非连接关系,多个相关的点组成单元,点的连接有隐式和显示,数据有标量和矢量 ![【学习笔记】Python科学计算三维可视化(黄天羽、嵩天)(学习中。。)](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230602/1393680-20191219153456482-918195184.png) **ImageData**表示二维或三维图像的数据结构,可以简单的理解为二维或三维数组,特点是在数组中存放数据,点位于正交且等距的网格上,我们不需要给出坐标,点之间的连接关系由它们在数组中的位置确定,点的连接关系是隐性的 ![【学习笔记】Python科学计算三维可视化(黄天羽、嵩天)(学习中。。)](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230602/1393680-20191219154957442-1602694047.png) ![【学习笔记】Python科学计算三维可视化(黄天羽、嵩天)(学习中。。)](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230602/1393680-20191219154435002-1688335367.png) ;gutter:true;
from tvtk.api import tvtk
img = tvtk.ImageData(spacing=(1,1,1),origin=(1,2,3),dimensions=(3,4,5))

print(img.get_point(0))

for n in range(6):
print("%.1f,%.1f,%.1f"% img.get_point(n))

RectilinearGrid:间距不均匀的网格,所有点都在正交的网格上

【学习笔记】Python科学计算三维可视化(黄天羽、嵩天)(学习中。。)

bash;gutter:true; from tvtk.api import tvtk import numpy as np</p> <p>x = np.array([0,3,9,15]) y = np.array([0,1,5]) z = np.array([0,2,3]) r = tvtk.RectilinearGrid() r.x_coordinates = x r.y_coordinates = y r.z_coordinates = z r.dimensions = len(x),len(y),len(z)</p> <pre><code> ![【学习笔记】Python科学计算三维可视化(黄天羽、嵩天)(学习中。。)](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230602/1393680-20191219155559431-1522797050.png) ![【学习笔记】Python科学计算三维可视化(黄天羽、嵩天)(学习中。。)](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230602/1393680-20191219155559827-596357365.png) ![【学习笔记】Python科学计算三维可视化(黄天羽、嵩天)(学习中。。)](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230602/1393680-20191219155600454-1981265107.png) 由于这些信息都要用户设置,因此用程序创建PolyData比较繁琐,TVTK很多三维模型可以输出PolyData对象 #### TVTK数据加载 大多数可视化数据并非是TVTK库中构建,而是通过接口读取外部数据文件 TVTK库继承关系 ![【学习笔记】Python科学计算三维可视化(黄天羽、嵩天)(学习中。。)](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230602/1393680-20191219161443110-500826994.png) ![【学习笔记】Python科学计算三维可视化(黄天羽、嵩天)(学习中。。)](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230602/1393680-20191219161443594-1280490544.png) ;gutter:true;
from tvtk.api import tvtk
from tvtkfunc import ivtk_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()

【学习笔记】Python科学计算三维可视化(黄天羽、嵩天)(学习中。。)

bash;gutter:true; from tvtk.api import tvtk</p> <p>def read_data():# 读入数据 plot3d = tvtk.MultiBlockPLOT3DReader( xyz_file_name="combxyz.bin",#网格文件 q_file_name="combq.bin",#空气动力学结果文件 scalar_function_number=100,#设置标量数据数量 vector_function_number=200#设置矢量数据数量 ) plot3d.update() return plot3d</p> <p>plot3d = read_data() grid = plot3d.output.get_block(0)

【学习笔记】Python科学计算三维可视化(黄天羽、嵩天)(学习中。。)

待续

Original: https://www.cnblogs.com/yongestcat/p/12023470.html
Author: 九命猫幺
Title: 【学习笔记】Python科学计算三维可视化(黄天羽、嵩天)(学习中。。)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/565658/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球