以立方体对象为例
from tvtk.api import tvtk
#设置属性,xyz轴上的长度,还可以设置center(坐标原点)
#output_points_precisio(对象的精度)
s = tvtk.CubeSource(x_length=1.0,y_length=2.0,z_length=3.0)
#查看数据源信息
print(s)
除了CubeSource(立方体三维对象数据源)外,tvtk还自带了ConeSource(圆锥三维对象数据源)、CylinderSource(圆柱三维对象数据源)、ArcSource(圆弧三维对象数据源)、ArrowSource(箭头三维对象数据源)
#使用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中可分为两类:可视化管线以及图像管线。
可视化管线:将原始数据加工成图形数据的过程
图像管线:将图形数据加工为图像的过程
#可视化管线处理
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)
r = tvtk.Renderer(background=(0,0,0))
r.add_actor(a)
w = tvtk.RenderWindow(size = (300,300))
w.add_renderer(r)
i = tvtk.RenderWindowInteractor(render_window = w)
TVTK对象 | 说明 |
---|---|
Actor | 场景实体,包括一个mapper,具有描述属性 |
Renderer | 渲染场景,需要多个需要渲染的Actor |
RenderWindow | 渲染用的图形窗口,需要一个或多个Render |
RenderWindowInteractor | 提供用户交互功能 |
数据集类型 | 说明 |
---|---|
ImageData | 二维或三维图像的数据结构 间距均匀的网格 在数组中存储 隐形连接 |
RectilinearGrid | 间距不均匀的网格 点在正交网格上 |
structuredGrid | 任意形状网格 需要指定点的坐标 |
PolyData | 由一系列的点、点之间的联系及由点构成的多边形组成 |
UnstructuredGrid | 无组织网格 |
#origin:数据起始点坐标
#spacing:数据在x、y、z轴上的间距
#dimensions:x、y、z轴上的网格数
img = tvtk.ImageData(spacing=(1,1,1),origin=(1,2,3),dimensions=(3,4,5))
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)
from tvtk.api import tvtk
from tvtkfunc import ivtk_scene,event_loop
s = tvtk.STLReader(file_name='xxx.stl')
m = tvtk.PolyDataMapper(input_connection = s.output_port)
a = tvtk.Actor(mapper=m)
win = ivtk_scene(a)
win.scene.isometric_view()
event_loop()
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)
#查看数据类型
print(type(plot3d.output))
print(type(grid))
#grid的形状
print(grid.dimensions)
#网格中每个点的坐标
print(grid.points.to_array())
#网格中的单元没有数据
print(grid.cell_data.number_of_arrays)
#点有四种数据
print(grid.point_data.number_of_arrays)
#标量数组的名字
print(grid.point_data.scalars.name)
#矢量数组的名字
print(grid.point_data.vectors.name)
对上步读取的数据进行可视化,使用等值面对标量场进行可视化。
采用tvtk.ContourFilter()
等值面过滤器抽取等值面。
方法 | 说明 |
---|---|
generate_values() | 设定n条等值线的值,用以重新绘制等值线 |
set_value() | 设定一条等值线的值,用以覆盖或增加一条等值线 |
con = tvtk.ContourFilter()
con.set_input_data(grid)
con.generate_values(10,grid.point_data.scalars.range)
m = tvtk.PolyDataMapper(scalar_range=grid.point_data.scalars.range,
input_connection = con.output_port)
a = tvtk.Actor(mapper = m)
a.property.opacity = 0.5 #设置Actor透明度
r = tvtk.Renderer(background=(0,0,0))
r.add_actor(a)
w = tvtk.RenderWindow(size = (300,300))
w.add_renderer(r)
i = tvtk.RenderWindowInteractor(render_window = w)
#开启交互
i.initialize()
i.start()
对上步读取的数据进行可视化,对矢量场进行可视化。
采用tvtk.Glyph3D()
用箭头表示矢量数据,同时为降低数据密度,使用tvtk.MaskPoints()
方法对数据进行降采样。
#矢量数据可视化
#每50个点选择一个点,降低数据密度
mask = tvtk.MaskPoints(random_mode = True,on_ratio = 50)
mask.set_input_data(grid)
#箭头
glyph_source = tvtk.ArrowSource()
#每个点上放置一个箭头,放缩系数为4
glyph = tvtk.Glyph3D(input_connection = mask.output_port,
scale_factor = 4)
glyph.set_source_connection(glyph_source.output_port)
m = tvtk.PolyDataMapper(scalar_range=grid.point_data.scalars.range,
input_connection = glyph.output_port)
a = tvtk.Actor(mapper = m)
r = tvtk.Renderer(background=(0,0,0))
r.add_actor(a)
w = tvtk.RenderWindow(size = (300,300))
w.add_renderer(r)
i = tvtk.RenderWindowInteractor(render_window = w)
#开启交互
i.initialize()
i.start()
采用tvtk.StructuredGridOutlineFilter()
计算PolyData对象的外边框
from tvtk.common import configure_input
outline = tvtk.StructuredGridOutlineFilter()
configure_input(outline,grid)
m = tvtk.PolyDataMapper(input_connection = outline.output_port)
a = tvtk.Actor(mapper=m)
a.property.color = 0.3,0.3,0.3
r = tvtk.Renderer(background=(1,1,1))
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()
#空间轮廓线以及标量结合
from tvtk.common import configure_input
con = tvtk.ContourFilter()
con.set_input_data(grid)
con.generate_values(100,grid.point_data.scalars.range)
m1 = tvtk.PolyDataMapper(scalar_range=grid.point_data.scalars.range,
input_connection = con.output_port)
a1 = tvtk.Actor(mapper = m1)
a1.property.opacity = 0.5 #设置Actor透明度
outline = tvtk.StructuredGridOutlineFilter()
configure_input(outline,grid)
m = tvtk.PolyDataMapper(input_connection = outline.output_port)
a = tvtk.Actor(mapper=m)
a.property.color = 0.3,0.3,0.3
r = tvtk.Renderer(background=(1,1,1))
r.add_actor(a)
r1 = tvtk.Renderer(background=(1,1,1))
r1.add_actor(a1)
#创建一个Renderwindow(窗口),将Renderer添加进去
w = tvtk.RenderWindow(size = (300,300))
w.add_renderer(r)
w.add_renderer(r1)
#创建一个RenderwindowInteractor(窗口的交互工具)
i = tvtk.RenderWindowInteractor(render_window = w)
#开启交互
i.initialize()
i.start()