TVTk的管线
管线技术(Pipeline,流水线)
可视化管线(Visualization Pipeline):将原始数据加工成图形数据的过程。
TVTK对象 | 说明 |
---|---|
CubeSource | 通过程序内部计算输出一组描述长方体的数据(PolyData) |
PolyDataMapper | PolyData通过该映射器将数据映射为图形数据(mapper) |
图形管线(Graphics Pipeline):图形数据加工为我们所看到的图像的过程。
TVTK对象 | 说明 |
---|---|
Actor | 场景中的一个实体。它包括一个图形数据(mapper),具有描述该实体的位置、方向、大小的属性。 |
Renderer | 渲染的场景。它包括多个需要渲染的Actor。 |
RenderWindow | 渲染用的图形窗口,它包括一个或者多个Render。 |
RenderWindowInteractor | 给图形窗口提供一些用户交互功能,例如平移、旋转、放大缩小。这些交互式操作并不改变Actor或者图形数据的属性,只是调整场景中的照相机(Camera)的一些设置。 |
用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)
#创建一个带Crust(Python Shell)的窗口
gui = GUI()
win = ivtk.IVTKWithCrustAndBrowser()
win.open()
win.scene.add_actor(a)
#窗口左侧栏,可将下面四行代码去掉查看变化,你发现你会加上这四行代码的。
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()
代码优化结构,将之封装成函数:
from tvtk.api import tvtk
def ivtk_scene(actors):
from tvtk.tools import ivtk
#创建一个带Crust(Python Shell)的窗口
win = ivtk.IVTKWithCrustAndBrowser()
win.open()
win.scene.add_actor(actors)
#窗口左侧栏,可将下面四行代码去掉查看变化,你发现你会加上这四行代码的。
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()
由于这两个函数可复用性和使用频率较高,可将这两个函数保存在tvtkfunc.py文件中,以后使用的话就用:
from tvtkfunc import ivtk_scene, event_loop
可以在上述界面调整照相机、实体Actor、光源、场景,下面是照相机的属性:
属性 | 说明 |
---|---|
clipping_plane | 它有两个元素,分别表示照相机到近、远两个裁剪平面的距离。在这两个平面范围之外将不会显示 |
position | 照相机在三维空间中的坐标 |
focal_point | 照相机所聚焦的焦点坐标 |
view_up | 照相机的上方向矢量 |
数据集
数据集(Dataset)。
- 点(Point)和数据(Data)
- 点之间:连接vs非连接
- 多个相关的点组成单元(Cell)
- 点的连接:显式vs隐式
- 数据:标量(Scalar)vs矢量(Vector)
数据集-Imagedata
ImageData表示二维或三维图像的数据结构。
from tvtk.api import tvtk
img = tvtk.ImageData(spacing=(1, 1, 1), origin=(1, 2, 3), dimension=(3, 4, 5))
参数 | 说明 |
---|---|
origin | 三维网格数据的起点坐标 |
spacing | 三维网格数据在X、Y、Z轴上的间距 |
dimensions | 为在X、Y、Z轴上的网格数 |
数据集-RectilinearGrid
RectilinearGrid:间距不均匀的网格,所有点都在正交的网格上。
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)
数据集-StructuredGrid
StructuredGrid:创建任意形状的网格,需要指定点的坐标。
points、dimensions、point_data.scalars等属性进行初始化
数据集-Polydata
PolyData:由一系列的点、点之间的联系以及由点构成的多边形组成。
TVTK数据加载
TVTK模型读取
s = tvtk.STLReader(file_name = 'stl文件名')
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.stl文件百度云链接
运行效果截图:
TVTK MultiBlock数据读取
Plot3D
- 网格(XYZ 文件)
- 空气动力学结果(Q 文件)
- 通用结果
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)
combxyz.bin和combq.bin文件百度云链接
Reference :
中国大学MOOC北京理工大学Python科学计算三维可视化黄天羽、嵩天老师课件
课程主页