【學習筆記】Python科學計算三維可視化(黃天羽、嵩天)(學習中。。)


0 導學

目的:掌握利用三維效果表達科學和工程數據的能力

傳播一種思想:可視化技術是數據之眼

image

內容組織:

    流體數據的標量可視化、矢量可視化實例

    三維掃描數據(模型/地形)可視化實例

    三維地球場景可視化實例

    曲線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安裝


安裝完測試下

image

from tvtk.tools import tvtk_doc
tvtk_doc.main()
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對象的屬性

imageimage此外tvtk還有其他基本三維對象

image試着建立個圓錐體數據源看看

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


顯示一個三維對象

image

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管線與數據加載

管線基本流程

image

幾乎所有渲染引擎都會涉及管線技術,TVTK管線分為2部分,其中:

        可視化管線:將原始數據加工為圖形數據的過程

imageimage        圖形管線:圖形數據加工為我們所看到的圖像的過程

imageimage

IVTK工具觀察管線

from tvtk.api import tvtk
from tvtk.tools import ivtk
from pyface.api import GUI
 
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)
 
#創建一個帶Crust(Python Shell)的窗口
gui = GUI()
win = ivtk.IVTKWithCrustAndBrowser()
win.open()
win.scene.add_actor(a)
 
#開始界面消息循環
gui.start_event_loop()

由於版本過高,from tvtk.tools import ivtk,這句出現錯誤。。。

imageimage

TVTK數據集

數據集,包括點與數據,點之間有連接和非連接關系,多個相關的點組成單元,點的連接有隱式和顯示,數據有標量和矢量

imageTVTK五種數據集image

ImageData表示二維或三維圖像的數據結構,可以簡單的理解為二維或三維數組,特點是在數組中存放數據,點位於正交且等距的網格上,我們不需要給出坐標,點之間的連接關系由它們在數組中的位置確定,點的連接關系是隱性的

imageimage

image



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:間距不均勻的網格,所有點都在正交的網格上

image如何構建

from tvtk.api import tvtk
import numpy as np
 
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)

同樣可以查看imageStructuredGrid:創建任意形狀的網格,需要指定點的坐標

imagePolyData:由一系列的點和點之間的聯系、點構成的多邊形組成

image

由於這些信息都要用戶設置,因此用程序創建PolyData比較繁瑣,TVTK很多三維模型可以輸出PolyData對象

TVTK數據加載

大多數可視化數據並非是TVTK庫中構建,而是通過接口讀取外部數據文件

TVTK庫繼承關系

imageVTK三維模型讀取

imageSTL文件是在計算機圖形應用系統中用於表示三角形網格的一種文件格式,這種格式非常簡單,應用很廣泛

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()

image

from tvtk.api import tvtk
 
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
 
plot3d = read_data()
grid = plot3d.output.get_block(0)

image的2




待續


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM