VTK对象的方法在TVTK中用Trait属性替代,例如VTK中m.SetInputConnection(c.GetOutputPort()),TVTK中m.input_connection(c.output_port)
from tvtk.tools import tvtk_doc
tvtk_doc.main()
In[3]: from tvtk.api import tvtk
In[4]: s = tvtk.CubeSource(x_length=1.0,y_length=2.0,z_length=3.0)
In[5]: print(s)
vtkCubeSource (000001A7ACDECA70)
Debug: Off
Modified Time: 132
Reference Count: 2
Registered Events:
Registered Observers:
vtkObserver (000001A7B0699C20)
Event: 33
EventName: ModifiedEvent
Command: 000001A7B097C560
Priority: 0
Tag: 1
Executive: 000001A7B0418800
ErrorCode: No error
Information: 000001A7AD8034D0
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(traits)
s表示对象变量,返回一个三维对象实例
tvtk.CubeSource是一个构造函数,构造具有一定traits属性的长方体数据源对象
什么是traits,英文意思的属性,由于python变量没有类型,导致实际操作中遇到了些不便利,traits库可以为python添加类型定义,由于tvtk正是在vtk上用traits库进行的封装形式,为了更简单的理解,我们可以认为traits就是tvtk对象的属性
此外tvtk还有其他基本三维对象
试着建立个圆锥体数据源看看
In[3]: from tvtk.api import tvtk
In[4]: s = tvtk.ConeSource(height=3.0,radius=1.0,resolution=36)
In[5]: s.height
Out[5]: 3.0
In[6]: s.radius
Out[6]: 1.0
In[7]: s.resolution
Out[7]: 36
In[8]: s.center
Out[8]: array([0., 0., 0.])
In[9]: print(s)
vtkConeSource (000002CC5566E290)
Debug: Off
Modified Time: 134
Reference Count: 2
Registered Events:
Registered Observers:
vtkObserver (000002CC572346C0)
Event: 33
EventName: ModifiedEvent
Command: 000002CC573449D0
Priority: 0
Tag: 1
Executive: 000002CC56FFA700
ErrorCode: No error
Information: 000002CC5722B540
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
显示一个三维对象
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()
将长方体数据转化为三维图像运用了什么技术?
管线(Pipeline),对象之间协调完成工作的过程,需要众多的的TVTK对象共同协调完成,如tvtk.CubeSource、tvtk.PolyDataMapper、tvtk.Actor、tvtk.Renderer、tvtk.RenderWindow、tvtk.RenderWindowInteractor
1.2 TVTK管线与数据加载
管线基本流程
几乎所有渲染引擎都会涉及管线技术,TVTK管线分为2部分,其中:
可视化管线:将原始数据加工为图形数据的过程
图形管线:图形数据加工为我们所看到的图像的过程
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)
#开始界面消息循环
gui.start_event_loop()
由于版本过高,from tvtk.tools import ivtk,这句出现错误。。。TVTK数据集
数据集,包括点与数据,点之间有连接和非连接关系,多个相关的点组成单元,点的连接有隐式和显示,数据有标量和矢量
TVTK五种数据集:
ImageData表示二维或三维图像的数据结构,可以简单的理解为二维或三维数组,特点是在数组中存放数据,点位于正交且等距的网格上,我们不需要给出坐标,点之间的连接关系由它们在数组中的位置确定,点的连接关系是隐性的
from tvtk.api import tvtk
img = tvtk.ImageData(spacing=(1,1,1),origin=(1,2,3),dimensions=(3,4,5))
print(img.get_point(0))
for n in range(6):
print("%.1f,%.1f,%.1f"% img.get_point(n))
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:创建任意形状的网格,需要指定点的坐标PolyData:由一系列的点和点之间的联系、点构成的多边形组成
由于这些信息都要用户设置,因此用程序创建PolyData比较繁琐,TVTK很多三维模型可以输出PolyData对象
TVTK数据加载
大多数可视化数据并非是TVTK库中构建,而是通过接口读取外部数据文件
TVTK库继承关系
VTK三维模型读取
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()
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
待续
作者:九命猫幺
博客出处:http://www.cnblogs.com/yongestcat/
欢迎转载,转载请标明出处。
如果你觉得本文还不错,对你的学习带来了些许帮助,请帮忙点击右下角的推荐