TVTk的管線
管線技術(shù)(Pipeline,流水線)
可視化管線(Visualization Pipeline):將原始數(shù)據(jù)加工成圖形數(shù)據(jù)的過程来惧。
TVTK對(duì)象 | 說明 |
---|---|
CubeSource | 通過程序內(nèi)部計(jì)算輸出一組描述長(zhǎng)方體的數(shù)據(jù)(PolyData) |
PolyDataMapper | PolyData通過該映射器將數(shù)據(jù)映射為圖形數(shù)據(jù)(mapper) |
圖形管線(Graphics Pipeline):圖形數(shù)據(jù)加工為我們所看到的圖像的過程供搀。
TVTK對(duì)象 | 說明 |
---|---|
Actor | 場(chǎng)景中的一個(gè)實(shí)體葛虐。它包括一個(gè)圖形數(shù)據(jù)(mapper)屿脐,具有描述該實(shí)體的位置宪卿、方向万栅、大小的屬性。 |
Renderer | 渲染的場(chǎng)景休溶。它包括多個(gè)需要渲染的Actor撒遣。 |
RenderWindow | 渲染用的圖形窗口义黎,它包括一個(gè)或者多個(gè)Render。 |
RenderWindowInteractor | 給圖形窗口提供一些用戶交互功能泻云,例如平移狐蜕、旋轉(zhuǎn)层释、放大縮小。這些交互式操作并不改變Actor或者圖形數(shù)據(jù)的屬性廉白,只是調(diào)整場(chǎng)景中的照相機(jī)(Camera)的一些設(shè)置乖寒。 |
用IVTK工具觀察管線
使用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)
#創(chuàng)建一個(gè)帶Crust(Python Shell)的窗口
gui = GUI()
win = ivtk.IVTKWithCrustAndBrowser()
win.open()
win.scene.add_actor(a)
#窗口左側(cè)欄楣嘁,可將下面四行代碼去掉查看變化,你發(fā)現(xiàn)你會(huì)加上這四行代碼的聋溜。
dialog = win.control.centralWidget().widget(0).widget(0)
from pyface.qt import QtCore
dialog.setWindowFlags(QtCore.Qt.WindowFlags(0x00000000))
dialog.show()
gui.start_event_loop()
代碼優(yōu)化結(jié)構(gòu)痊班,將之封裝成函數(shù):
from tvtk.api import tvtk
def ivtk_scene(actors):
from tvtk.tools import ivtk
#創(chuàng)建一個(gè)帶Crust(Python Shell)的窗口
win = ivtk.IVTKWithCrustAndBrowser()
win.open()
win.scene.add_actor(actors)
#窗口左側(cè)欄涤伐,可將下面四行代碼去掉查看變化缨称,你發(fā)現(xiàn)你會(huì)加上這四行代碼的祝迂。
dialog = win.control.centralWidget().widget(0).widget(0)
from pyface.qt import QtCore
dialog.setWindowFlags(QtCore.Qt.WindowFlags(0x00000000))
dialog.show()
return win
def event_loop():
from pyface.api import GUI
gui = GUI()
gui.start_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()
由于這兩個(gè)函數(shù)可復(fù)用性和使用頻率較高型雳,可將這兩個(gè)函數(shù)保存在tvtkfunc.py文件中,以后使用的話就用:
from tvtkfunc import ivtk_scene, event_loop
可以在上述界面調(diào)整照相機(jī)沿量、實(shí)體Actor朴则、光源钓简、場(chǎng)景,下面是照相機(jī)的屬性:
屬性 | 說明 |
---|---|
clipping_plane | 它有兩個(gè)元素撤蚊,分別表示照相機(jī)到近侦啸、遠(yuǎn)兩個(gè)裁剪平面的距離丧枪。在這兩個(gè)平面范圍之外將不會(huì)顯示 |
position | 照相機(jī)在三維空間中的坐標(biāo) |
focal_point | 照相機(jī)所聚焦的焦點(diǎn)坐標(biāo) |
view_up | 照相機(jī)的上方向矢量 |
數(shù)據(jù)集
數(shù)據(jù)集(Dataset)豪诲。
- 點(diǎn)(Point)和數(shù)據(jù)(Data)
- 點(diǎn)之間:連接vs非連接
- 多個(gè)相關(guān)的點(diǎn)組成單元(Cell)
- 點(diǎn)的連接:顯式vs隱式
- 數(shù)據(jù):標(biāo)量(Scalar)vs矢量(Vector)
數(shù)據(jù)集-Imagedata
ImageData表示二維或三維圖像的數(shù)據(jù)結(jié)構(gòu)屎篱。
from tvtk.api import tvtk
img = tvtk.ImageData(spacing=(1, 1, 1), origin=(1, 2, 3), dimension=(3, 4, 5))
參數(shù) | 說明 |
---|---|
origin | 三維網(wǎng)格數(shù)據(jù)的起點(diǎn)坐標(biāo) |
spacing | 三維網(wǎng)格數(shù)據(jù)在X葵蒂、Y践付、Z軸上的間距 |
dimensions | 為在X、Y隧土、Z軸上的網(wǎng)格數(shù) |
數(shù)據(jù)集-RectilinearGrid
RectilinearGrid:間距不均勻的網(wǎng)格,所有點(diǎn)都在正交的網(wǎng)格上辐脖。
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)
數(shù)據(jù)集-StructuredGrid
StructuredGrid:創(chuàng)建任意形狀的網(wǎng)格皆愉,需要指定點(diǎn)的坐標(biāo)幕庐。
points、dimensions瑟由、point_data.scalars等屬性進(jìn)行初始化
數(shù)據(jù)集-Polydata
PolyData:由一系列的點(diǎn)届吁、點(diǎn)之間的聯(lián)系以及由點(diǎn)構(gòu)成的多邊形組成。
TVTK數(shù)據(jù)加載
TVTK模型讀取
s = tvtk.STLReader(file_name = 'stl文件名')
from tvtk.api import tvtk
from tvtkfunc import ivtk_scene,event_loop#詳細(xì)見上
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()
運(yùn)行效果截圖:
TVTK MultiBlock數(shù)據(jù)讀取
Plot3D
- 網(wǎng)格(XYZ 文件)
- 空氣動(dòng)力學(xué)結(jié)果(Q 文件)
- 通用結(jié)果
from tvtk.api import tvtk
def read_data():# 讀入數(shù)據(jù)
plot3d = tvtk.MultiBlockPLOT3DReader(
xyz_file_name="combxyz.bin",#網(wǎng)格文件
q_file_name="combq.bin",#空氣動(dòng)力學(xué)結(jié)果文件
scalar_function_number=100,#設(shè)置標(biāo)量數(shù)據(jù)數(shù)量
vector_function_number=200#設(shè)置矢量數(shù)據(jù)數(shù)量
)
plot3d.update()
return plot3d
plot3d = read_data()
grid = plot3d.output.get_block(0)
Reference :
中國(guó)大學(xué)MOOC北京理工大學(xué)Python科學(xué)計(jì)算三維可視化黃天羽亮蛔、嵩天老師課件
課程主頁(yè)