Download presentation
Presentation is loading. Please wait.
1
上一节课内容回顾 2.1 Python概要 2.2 Python 快速入门
(1)基本的运算式(int,long,float,complex) (2)基本数据类型与操作(String,List,Tupe,Dictionary) (3)函数 def myFunction(...): (4)类 class myClass(...): (5)控制流程 If else; while :; for .. in () : (6)模块 py pyc pyo
2
上一节课内容回顾 2.1 Python安装 在http://iee.pku.edu.cn/lesson/eiv下,有python的安装文件:
python-2.5.msi 执行 python-2.5.msi 进行安装; 设置路径python25和python25\dlls到PATH中。 2.2 Python 相关网站 中文PYTHON论坛 PYTHON主站点 2.3 Python程序的编辑与运行 使用任何文本编辑程序都可编写python程序。保存为*.py 在DOS提示符下输入python *.py即可运行,或在IDLE中打开*.py文件,运行即可。另外,如果是2000或xp,可把*.py和python.exe关联起来,然后输入*.py或鼠标直接Click运行。
3
上一节课内容回顾 关于函数的缺省参数: print '----函数func1的结果----' def func1(a, b=[]):
b.append(a) return b def func2(a, b=None): if( b == None ): b=[] print '----函数func1的结果----' print func1(1) print func1(2) print func1(3) print print '----函数func2的结果----' print func2(1) print func2(2) print func2(3) ----函数func1的结果---- [1] [1, 2] [1, 2, 3] ----函数func2的结果---- [1] [2] [3]
4
上一节课内容回顾 def func1(a, b=[]):
函数func1的参数b带有缺省值[],这意味着python在生成函数对象func1时,自动为参数b生成一个缺省列表对象[].这个对象本身是不能改变的,任何时候以缺省参数调用func1时都是访问的该列表对象。列表不变,但列表的内容却是可变的。 def func2(a, b=None): 函数func2的参数b带有缺省值None,这意味着python在生成函数对象func2时,自动为参数b生成一个缺省对象None.这个对象本身时不能改变的,任何时候以缺省参数调用func2时都是访问的该空对象。
5
本节课内容 VTK: A Tutorial, 介绍VTK的基本内容 1 What is VTK? 2 VTK图形模型 3 VTK可视化模型
6
有vtk 5.0版已编译好的安装文件:VTK.ZIP 把VTK.ZIP解压到目录python25\下。
在 有vtk 5.0版已编译好的安装文件:VTK.ZIP 把VTK.ZIP解压到目录python25\下。 (2) VTK的主站点 在 可在该站点上下载最新版的源代码、特定平台的二进制代码、例子、数据和文档等。
7
VTK 是几个较为广泛使用的可视化系统之一。AVS 是商用系统,IBM ’s Data Explorer (DX)原先为商用系统,目前已转为开放源代码系统并改名为OpenDX.其它还有NAG Explorer 4 and Template Graphics Amira. VTK是一个通用可视化系统, 已被许多大学和研究机构采用,作为教学和研究工具。许多公司也在其基础上开发了各种可视化系统,包括医学可视化,体可视化,石油勘探,声学系统,流体系统,有限元分析,表面重构等。
8
3.1 What is VTK? 开放源代码、可移植 (WinTel/Unix)、面向对象的3D计算 机图形,可视化,和图像处理系统; 以 C ++语言实现,支持Tcl、Python和Java语言; 支持复杂应用程序开发,应用程序快速原型开发; 支持多种GUI开发环境,如Tk 、X/Motif、MFC、wxWidgets 。 提供数据表达类型,包括无结构点集,多边形数据,图像,体元,结构 格网,正交格网,以及无结构格网等. 通过 readers/import以及writers/export和其它程序交换数据。 提供数百个数据处理器处理各种数据,从图像变换到三角网构建. VTK绘制模式支持2D、多边形、体元和纹理绘制,以及它们的各 种组合。
9
3.2 VTK结构 3.2.1 VTK 在API访问接口上包括两个主要部分: C++实现的核心层 自动生成的接口层,包括Tcl、Java和Python.
10
C++实现的核心层: 数据结构、算法和对计算时间要求高的系统函数在C++核心层中实现。 核心层中采用对象工厂和虚拟函数等提高系统可移植性以及可扩展性。 VTK在核心层独立于任何GUI,不依赖于某一特定的窗口系统。应用程序开发者能很方便地把VTK插入到自己开发的系统中。 VTK通过抽象的图像模型实现图形的可移植性。
11
自动生成的接口层: 核心层提供速度和效率,接口层提供的是灵活和可扩展能力。 例如使用GUI原型开发工具如Tcl/Tk, Python/Tk, Python/wxPython, 或 Java AWT可进行专业应用程序的快速开发。
12
3.2.2 VTK内部组成 VTK内部包括两个主要的子系统 —图形模型子系统和可视化管道子系统。 (1)图形模型子系统 图形模型是建立在图形语言(如OPENGL)基础上的抽象层,提供跨平台的可移植性。 在1993年, 不同的计算机平台有各自的图形语言: XGL for Sun, Starbase for Hewl tt-Packard, gl for Silicon Graphics. 为了实现图形的平台与设备无关,提出了图形模型. 图形模型中的对象采用电影工业中的名称命名。灯光、相机、演员和道具是 用户创建场景所使用的类。通过抽象图形模型,3D多边形绘制(lights,cameras,actors)和体绘制以及其它绘制方式就有了一致的访问接口。
14
绘制窗口和绘制器: 可视化具体的数据前,必须在计算机屏幕上打开一个绘制窗口。vtkRenderWindow是一个或多个绘制器在其上进行绘制的窗口的抽象基类。直接调用vtkRenderWindow 可以自动生成所在平台上与设备相关的窗口子类。 vtkRenderWindow是vtkRenderer对象的容器对象。多个vtkRenderer对象可以平铺在一个vtkRenderWindow 中,从而创建复合的可视化系统。
15
下面例子把两个绘制器放在一个绘制窗口中。每一个有不同的背景颜色:
from vtk import * renWin =vtkRenderWindow() renWin.SetSize( 600, 300) ren1=vtkRenderer() ren1.SetViewport( 0.0, 0.0, 0.5, 1.0) ren1.SetBackground( 0.8, 0.4, 0.2) renWin.AddRenderer( ren1) ren2 =vtkRenderer() ren2.SetViewport( 0.5, 0.0, 1.0, 1.0) ren2.SetBackground( 0.1, 0.2, 0.4) renWin.AddRenderer( ren2) renWin.Render() 运行
16
交互器: 一般,我们使用鼠标控制场景中的相机位置和方向,以及其它道具。vtkRenderWindowInteractor提供交互功能。 iren=vtkRenderWindowInteractor() iren.SetRenderWindow(renWin) iren.Initialize() iren.Start()
17
道具, 映射器,和特性 道具是被加到绘制器中创建场景的对象。 vtkProp是所有 2D和3D道具的抽象基类,包含可见性、方向、大小和位置信息。 道具与映射器及特性对象关联. 映射器引用输入数据对象并知道如何绘制该输入对象. 特性对象包含绘制参数,如颜色和材质等.
18
绘制3D 几何数据 vtkActor是在场景中绘制3D几何数据的 vtkProp道具类的子类。 演员类对象自动创建缺省的vtkProperty对象,但要求用户自己创建vtkMapper子类。根据几何特性的不同,从vtkDataSetMapper或vtkPolyDataMapper中选择一个. 如果数据是用vtkPolyData表示的,包含点,线,和多边形,则使用 vtkPolyDataMapper,否则使用vtkDataSetMapper。
19
下例创建一个立方体: cubeData=vtkCubeSource() cubeMapper=vtkPolyDataMapper() cubeMapper.SetInput(cubeData.GetOutput()) cubeActor=vtkActor() cubeActor.SetMapper(cubeMapper) Ren1.AddProp(cubeActor) Ren1.ResetCamera() renWin.Render() 运行 由于vtkCubeSource对象是多边形数据,使用vtkPolyDataMapper绘制数据,ResetCamera()把相机对准数据
20
旋转与改变颜色: cubeActor.RotateX( 30.0) cubeActor.RotateY( 20.0) cubeActor.GetProperty().SetColor( 1.0, 0.7, 0.7) renWin Render 使用演员的GetProperty()访问自动创建的特性对象。 运行ch3\cubecolor.py
21
3D体数据绘制 vtkImageData是vtkDataSet的子类,可表示1D、2D和3D图像数据。作为vtkDataSet的子类,vtkImageData可用vtkActor表示,并可用 vtkDataSetMapper进行绘制。在3D下, vtkImageData数据被看作体元,相应的,它就可用vtkVolume表示,并用 vtkVolumeMapper的子类绘制. VTK目前支持三种类型的体绘制 —光线跟踪,2D纹理映射,以及VolumePro图形卡.
22
下例中,首先读入一个3D结构数据,然后使用vtkVolumeTextureMapper2D绘制:
negReader=vtkSLCReader() negReader.SetFileName( “neghip.slc”) negMapper=vtkVolumeTextureMapper2D() negMapper.SetInput(negReader.GetOutput()) 体绘制最困难的是定义转换函数,把标量值转成颜色和透明度。 negOpacity=vtkPiecewiseFunction() negOpacity.AddPoint(0 ,0.0) negOpacity.AddPoint(255, 0.2) negColor=vtkColorTransferFunction() negColor.AddRGBPoint( 64, 1.0, 0.0, 0.0) negColor.AddRGBPoint( 128, 0.0, 0.0, 1.0) negColor.AddRGBPoint( 196, 0.0, 1.0, 0.0)
23
创建体元特性和体元道具: negProperty=vtkVolumeProperty() negProperty.SetColor( negColor) negProperty.SetScalarOpacity(negOpacity) negVolume = vtkVolume() negVolume.SetMapper(negMapper) negVolume.SetProperty(negProperty) ren2.AddProp(negVolume) ren2.ResetCamera() renWin.Render() 运行
24
几何与体元的混合: VTK在一个场景中可以混合多个演员和体元进行绘制。下例,多边形和体元混合在一起。 posReader=vtkPolyDataReader() posReader.SetFileName(“poshipsurface.vtk”) posMapper=vtkPolyDataMapper() posMapper.SetInput(posReader.GetOutput()) posActor=vtkActor() posActor.SetMapper( posMapper ) ren2.AddProp( posActor ) renWin.Render() 运行
25
2D数据绘制 除了3D几何和体元数据,VTK能够可视化2D数据,如几何,图像,和文本。演员,映射器,和特性同样适用于2D数据。下例把2D数据和3D数据混合绘制。vtkActor2D表示场景中的标题, vtkTextMapper绘制文本数据, vtkActor2D自动创建vtkProperty2D对象。 titleMapper=vtkTextMapper() titleMapper.SetInput(“This is a Pink Cube ”) titleMapper.GetTextProperty().SetJustificationToCentered() titleActor=vtkActor2D() titleActor.SetMapper( titleMapper) titleActor.GetProperty().SetColor( 1, 1, 0) pc=titleActor.GetPositionCoordinate() pc.SetCoordinateSystemToNormalizedViewport() Pc.SetValue( 0.5, 0.92) ren1.AddProp(titleActor) renWin.Render() 运行
26
2D数据常用于注记,VTK提供了一些对象,能够把多个2D 演员和映射器组合成一个2D演员。例如, vtkScalarBarActor 把文本和2D多边形组合成图例:
scalarBar = vtkScalarBarActor() scalarBar.SetLookupTable( negColor ) scalarBar.SetTitle(“Density”) sPC=scalarBar.GetPositionCoordinate() sPC.SetCoordinateSystemToNormalizedViewport() sPC.SetValue(0.8, 0.1) ren2.AddProp( scalarBar) renWin.Render() 运行
27
灯光, 相机 VTK应用程序不需要显式创建vtkLight 或 vtkCamera。如果没有创建,系统会自动创建。从绘制器可以修改位置、焦点以及视场等。相机包含一些方法,通过它们可调整位置,旋转等,如Azimuth(),Elevation(),Roll(),Pitch(),and Yaw()。 cam=ren2.GetActiveCamera() cam.Azimuth( 20.0) cam.Elevation( 10.0) renWin.Render() 运行
28
灯光缺省是白光,位置和焦点缺省情况下和相机一致。下例加入第二个光源,绿色。
light = vtkLight() light.SetFocalPoint( 0.0, 0.0, 0.0) light.SetPosition( 1.0, 0.0, 0.0) light.SetColor( 0.0, 1.0, 0.0) light.SetIntensity( 0.5) ren2.AddLight(light) renWin.Render() 运行
29
(2) VTK可视化管道 VTK 数据处理管道把数据变换成可由图形子系统绘制的形式,或 变换成其它形式,以待管道的后续处理。例如, 读入离散点,通过三角化创建多边形,使用面绘制显示mesh面等构成一个数据处理管道。 管道,也叫做可视化网络,通过连接处理对象和数据对象构成。数据对象提供对数据的访问,处理对象操作数据对象。在实现上,连接通过 SetInput()/GetOutput()方法实施: aFilter.SetInput(bFilter.GetOutput()) Filters创建与它的输出类型一致的内部数据对象。只有输出与输入类型匹配的连接能够成立。上例中,bFilter的输出类型和aFilter的输入类型必须一致。类型检查可在编译时或运行时进行。
33
一旦管道构建起来,Filters则只有在内部状态改变了或它的输入数据改变了才能重新执行。
VTK 采用分布式隐含更新方法控制管道的运行。每个对西那个管理一个内部时间标记,只有过时的对象才能重新运算。
34
数据对象: VTK一般把数据表示成场数据,数据集是带有拓扑和几何结构的数据对象。除了结构,数据集还附带有属性数据。属性数据包括:标量,矢量,张量,法向,纹理坐标,以及场数据。
36
处理对象: VTK提供了数百个处理对象。其中多数只处理一种数据类型(如图像处理对象)。一些处理对象如vtkContourFilter 接受一种类型的数据输入,输出另一种类型的数据。 处理对象一般被称为Filters。VTK把处理对象分为三类:源处理对象, 过滤器,和映射器。 源处理对象没有VTK数据输入,但产生一到多个输出,如读入器。 过滤器接受一到多个输入,产生一到多个输出。 映射器是管道的终点, 它或者和图形系统耦合在一起,或者把数据写到磁盘或另一管道。
37
例子: 读取数字化的多边形数据, 然后简化,用Laplacian 光滑减少面噪声,生成面法线,修饰表面: 读多边形数据: Reader=vtkBYUReader() Reader.SetGeometryFileName( “fran.g ”) 创建管道,由decimator,smoother,和 normal generator组成。 Deci=vtkDecimatePro() Deci.SetInput(reader.GetOutput()) Deci.SetTargetReduction( 0.9) Deci.PreserveTopologyOn() Smoother=vtkSmoothPolyDataFilter() Smoother.SetInput(deci.GetOutput())
38
Normals=vtkPolyDataNormals()
Normals.SetInput(smoother.GetOutput()) Normals.SetFeatureAngle( 60 ) mapper = vtkPolyDataMapper() Mapper.SetInput(normals.GetOutput()) fran = vtkActor() Fran.SetMapper(mapper) Fran.GetProperty().SetColor( 1, 0.49, 0.25) ptMask = vtkMaskPoints() ptMask.SetInput(normals.GetOutput()) ptMask.SetOnRatio( 10) ptMask.RandomModeOn() cone = vtkConeSource() Cone.SetResolution( 6)
39
Transform=vtkTransform()
Transform.Translate( 0.5, 0.0, 0.0) transformF =vtkTransformPolyDataFilter() transformF.SetInput(cone.GetOutput()) transformF.SetTransform( transform ) Glyph.vtkGlyph3D() Glyph.SetInput(ptMask.GetOutput()) Glyph.SetSource(transformF.GetOutput()) Glyph.SetVectorModeToUseNormal() Glyph.SetScaleModeToScaleByVector() Glyph.SetScaleFactor(0.004) spikeMapper = vtkPolyDataMapper() spikeMapper.SetInput(glyph.GetOutput()) spikeActor = vtkActor() spikeActor.SetMapper(spikeMapper) spikeActor.GetProperty().SetColor( 0, .79, .34)
40
ren3 =vtkRenderer() renWin2=vtkRenderWindow() renWin2.AddRenderer( ren3) Iren2=vtkRenderWindowInteractor() Iren2.SetRenderWindow( renWin2) Ren3.AddActor( fran) Ren3.AddActor( spikeActor) renWin2.Render() 运行
45
第一套 作业要求 : 一 创建交互器和交互窗口 a 创建1个交互器vtkRenderWindowInteractor; b 创建1个绘制窗口vtkRenderWindow; c 在上述绘制窗口中,创建3个绘制器vtkRenderer。 二 绘制内容 1 在第一个绘制器中: 绘制一个立方体cube和一个标题如“This is a cube”; 2 在第二个绘制器中: 在1的基础上,改变缺省灯光的颜色为绿色,并改变缺省相机的方位角; 3 在第三个绘制器中: 绘制一个图例,颜色由黄色变到蓝色,范围从100到200 ; 三 提交方式:
46
下一节课内容: 4.1 可视化数据类型 4.2 科学数据管理 4.3 科学数据格式 4.4 图形图像数据格式 4.5 VTK中的数据对象
47
网格数据: 笛卡儿网格 规整网格 矩形网格 结构网格 非结构网格 曲线网格 块结构网格 混合结构网格 散乱点
48
科学数据格式: HDF格式 CDF和NetCDF
49
VTK中的数据对象: vtkDataObject vtkPiecewiseFunction vtkDataSet vtkImageData vtkStructuredPoints vtkImageCanvasSource2D vtkPointSet vtkPolyData vtkStructuredGrid vtkUnstructuredGrid vtkRectilinearGrid vtkDataSetAttributes vtkPointData vtkCellData vtkFieldData vtkAttributeData
50
vtkCell vtkHexahedron vtkLine vtkPixel vtkPolyLine vtkPolyVertex vtkPolygon vtkQuad vtkTetra vtkTriangle vtkTriangleStrip vtkVertex vtkVoxel vtkWedge vtkPyramid
Similar presentations