Python科学计算三维可视化(2) ——TVTK库管线与数据加载

最近在中国大学MOOC网上学习Python科学计算三维可视化相关知识,记录下来,以供参考。

TVTK库管线与数据加载

TVTK的管线

管线技术(Pipeline,流水线)
可视化管线(Visualization Pipeline):将原始数据加工成图形数据的过程。
图形管线(Graphics Pipeline):图形数据加工为我们所看到的图像的过程。

可视化管线

这里写图片描述

TVTK对象说明
CubeSource通过程序内部计算输出一组描述长方体的数据(PolyData)
PolyDataMapperPolyData通过该映射器将数据映射为图形数据(mapper)

图形管线

这里写图片描述

TVTK对象说明
Actor场景中的一个实体。它包括一个图形数据(mapper),具有描述该实体的位置、方向、大小的属性。
Renderer渲染的场景。它包括多个需要渲染的Actor。
RenderWindow渲染用的图形窗口,它包括一个或者多个Render。
RenderWindowInteractor给图形窗口提供一些用户交互功能,例如平移、旋转、放大缩小。这些交互式操作并不改变Actor或者图形数据的属性,只是调整场景中的照相机(Camera)的一些设置。

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

封装

#命名为tvtkfunc.py
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()

数据集

数据集(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),dimensions=(3,4,5))
>>> for n in range(6):
    print("%.1f,%.1f,%.1f" % img.get_point(n))


1.0,2.0,3.0
2.0,2.0,3.0
3.0,2.0,3.0
1.0,3.0,3.0
2.0,3.0,3.0
3.0,3.0,3.0
参数说明
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)
for n in range(10):
    print(r.get_point(n))

(0.0, 0.0, 0.0)
(3.0, 0.0, 0.0)
(9.0, 0.0, 0.0)
(15.0, 0.0, 0.0)
(0.0, 1.0, 0.0)
(3.0, 1.0, 0.0)
(9.0, 1.0, 0.0)

数据集-StructuredGrid

StructuredGrid:创建任意形状的网格,需要指定点的坐标。
在构建时要对points、dimensions、point_data.scalars等属性进行初始化

这里写图片描述

数据集-Polydata

PolyData:由一系列的点、点之间的联系以及由点构成的多边形组成。
用程序构建较为繁琐。

这里写图片描述

TVTK数据加载

TVTK模型读取

stl文件是在计算机图形应用系统中用以表示三角形网格的一种文件格式,应用广泛。

from tvtk.api import tvtk
from tvtkfunc import ivtk_scene, event_loop

s = tvtk.STLReader(file_name="python.stl")  #调用stl文件
m = tvtk.PolyDataMapper(input_connection=s.output_port)
a = tvtk.Actor(mapper=m)

win = ivtk_scene(a)
win.scene.isometric_view()
event_loop()

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)
  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值