1. 程式人生 > >Python科學計算三維視覺化(1) ——TVTK庫入門

Python科學計算三維視覺化(1) ——TVTK庫入門

最近在中國大學MOOC網上學習python科學計算三維視覺化相關知識,記錄下來,以供參考。

科學視覺化基礎

科學計算的視覺化方法

  1. 二維標量資料場
    1.1 顏色對映方法
    1.2 等值線方法
    1.3 立體圖法和層次分割法
  2. 三維標量資料場
    2.1 面繪製方法(surface rendering)
    2.2 體繪製方法(volume rendering)
  3. 向量資料場
    3.1 直接法
    3.2流線法(stream line)

TVTK庫的安裝

VTK-7.1.1-cp36-cp36m-win_amd64.whl
numpy-1.12.1+mkl-cp36-cp36m-win_amd64.whl
traits-4.6.0-cp36-cp36m-win_amd64.whl
mayavi-4.5.0+vtk71-cp36-cp36m-win_amd64.whl
PyQt4-4.11.4-cp36-cp36m-win_amd64.whl

TVTK庫的安裝小測

>>> from tvtk.api import tvtk
>>> s = tvtk.CubeSource(x_length = 1.0,y_length = 2.0,z_length = 3.0)
>>> print(s)    
vtkCubeSource (0000020A22196F60)
  Debug: Off
  Modified Time: 96
  Reference Count: 2
  Registered Events: 
    Registered Observers:
      vtkObserver (0000020
A25B90240) Event: 33 EventName: ModifiedEvent Command: 0000020A258E4CD0 Priority: 0 Tag: 1 Executive: 0000020A25BA0170 ErrorCode: No error Information: 0000020A25C6E570 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(x_length=1.0, y_length=2.0, z_length=3.0)

CubeSource物件的屬性

屬性 說明
s.x_length 長方體物件在X軸方向的長度
s.y_length 長方體物件在y軸方向的長度
s.z_length 長方體物件在z軸方向的長度
s.center 長方體物件所在座標系的原點
s. output_points_precision 長方體物件的精度

CubeSource物件的方法

VTK方法 Tvtk 說明
Set/GetXLength() x_length 設定/獲取長方體物件在X軸方向的長度
Set/GetYLength() y_length 設定/獲取長方體物件在Y軸方向的長度
Set/GetZLength() z_length 設定/獲取長方體物件在Z軸方向的長度
Set/GetCenter() center 設定/獲取長方體物件所在座標系的原點

Tvtk庫的基本三維物件

三維物件 說明
CubeSource 立方體三維物件資料來源
ConeSource 圓錐三維物件資料來源
CylinderSource 圓柱三維物件資料來源
ArcSource 圓弧三維物件資料來源
ArrowSource 箭頭三維物件資料來源

建立一個圓錐資料來源

>>> s = tvtk.ConeSource(height = 3.0,radius = 1.0,resolution = 36)    #高度、底面圓半徑。底面圓解析度
>>> s.height
3.0
>>> s.radius
1.0
>>> s.resolution
36
>>> s.center
array([ 0.,  0.,  0.])
>>> print(s)
vtkConeSource (0000020A25B7FE10)
  Debug: Off
  Modified Time: 133
  Reference Count: 2
  Registered Events: 
    Registered Observers:
      vtkObserver (0000020A25B91260)
        Event: 33
        EventName: ModifiedEvent
        Command: 0000020A258E4490
        Priority: 0
        Tag: 1
  Executive: 0000020A25BA0F80
  ErrorCode: No error
  Information: 0000020A25C6F240
  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

TVTK庫顯示一個三維物件

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

原始資料轉換為螢幕上影象,TVTK物件共同協調完成:
tvtk.CubeSource
tvtk.PolyDataMapper
tvtk.Actor
tvtk.Renderer
tvtk.RenderWindow
tvtk.RenderWindowInteractor
在TVTK中,這種物件之間協調完成工作的過程被稱作管線(Pipeline)。