Vtk userguide
组织:分为三部分,parti通用介绍,如VTK安装方法;part ii是核心部分,提供了大量的示例;partiii介绍高级应用,如何创建自己的类。
HOW TO USEVTK
vtk创建者和应用者。创建或修改必须熟悉C++,并且知悉VTK的编程约定;对于应用者可以从TCL,PYTHON,VB,JAVA,VC等中选择自己熟悉的语言,但需熟悉VTK的对象接口及其关系。
ADDITIONRESOURCES
The Visualization ToolktAn Object-Oriented Approach to 3D Graphics(2rdEdition):该书详细描述了VTK中的多个算法,数据结构等。
http://public.kitware.com/:提供有在线手册,FAQ和用户邮件列表等
http://public.kitware.com/VTK/doc/nightly/html:在线VTK文档
http://www.barre.nom.fr/vtk/links.html:SebastienBarre的网站
Installation
Windows
直接下载安装文件,执行setup.exe
安装后文件包含5个部分:
vtkNNCore:用于Windows的VTKDLL
vtkNNCpp:用于VC++的文件和库
vtkNNTcl:用于Tcl的文件和库
vtkNNJava::用于Java的文件和库
vtknnPython::用于Python的文件和库
CMake:从源码构建VTK的工具
源码安装
SystemOverview
对于VTK的系统的概述:介绍基本系统概念和对象模型抽象
VTK由两个基本子系统构成:已编译C++类库和已解释的封装器用于其他语言,如Tcl,java,Python等
VTK本身是基于OO模型构建的,因此仅需理解主要对象就可以构建应用系统:图形模型GraphicsModel和可视化模型Visualization Model
The GraphicsModel
下面是一些常用的核心对象:
vtkActor, vtkActor2D,vtkVolume--vtkProp和/或vtkProp3D的子类
vtkLight--灯光
vtkCamera--镜头,照相机
vtkProperty,vtkProperty2D--
vtkMapper,vtkMapper2D--vtkAbstractMapper的子类
vtkTransform--
vtkLookupTable,vtkColorTransferFunction
vtkRender
vtkRenderWindow
vtkRenderWindowInteracto
可以通过对上述对象的组合形成场景Scene。
Props表示在场景所见到的物体。三维场景中的通常是vtkProp3D对象,如vtkActor,vtkVolume等;二维场景中的则通常是vtkActor2D对象。
Props不能直接表示其几何形状,通过其相关的mappers表示。
Props还可以通过属性对象控制其外观,如颜色,灯光,绘制方式等。
Actors和Volumes具备内部转换对象vtkTransform,其封装了4*4的变换矩阵,可以调整其几何参数(位置,朝向和缩放)。
灯光vtkLight对象用于设置场景中的灯源,只能用于3D场景。
相机对象vtkCamera控制3D物体如何投影成2D图形。只在3D场景有必要设置。可以控制几何参数以及投影方式:正交投影和透视投影。
绘图器vtkMapper对象以及相关的查找表vtkLookupTable对象用于变换和绘制几何图形。mapper提供了可视化管道和图形模型之间的接口。
渲染器vtkRenders对象和渲染窗口vtkRenderWindow对象用于管理图形引擎和计算机视窗系统之间的接口。一个渲染窗口可以同时支持多个渲染器。渲染器作图的区域即为视口viewport。
场景交互可以通过vtkRenderWindowInteracto
上述描述的类通常都有特殊行为的子类,如vtkAssembly,vtkFollower,vtkLODActor均是vtkActor的子类。vtkAssembly允许层次式组织actors;vtkFollwer是一个总是面向指定相机的actor,尤其对于文本和广告显示是十分有用的;vtkLODActor是允许改变角色actors的几何表示的actor
图像数据ImageData:vtkImageData
矩阵线性数据RectilinearGrid:vtkRectilinearGrid,其数据组织形式是行列方向线性增长
结构化数据vtkStructuredGrid,无结构化数据点,多边形数据vtkPolyData,无结构化栅格数据vtkUnstructuredGrid
VTK使用数据流的形式转换,其中涉及两个基本对象:vtkDataObject和vtkProcessObject。
DataObject数据对象:
DataSet数据集:图像数据ImageData:vtkImageData
矩阵线性数据Rectilinear Grid:vtkRectilinearGrid,其数据组织形式是行列方向线性增长
结构化数据vtkStructuredGrid,无结构化数据点,多边形数据vtkPolyData,无结构化栅格数据vtkUnstructuredGrid
Cell:是点的拓扑组织,构成数据集的基本形式,用作点之间的插值信息。
处理对象vtkProcessObject:也称作过滤器,滤波器,将已有数据处理形成新的数据。代表了系统所用的算法。Process和数据对象连接在一起形成可视化管道,即数据流网络。
--------
|Source
|
|DataObject
--------
源Source对象:通过读取文件或重构数据对象产生数据。
过滤器Filter:将输入数据处理后生成新的数据,其中输入或输出数据可以单个,或多个Source object
绘图器Mapper:位于图形模型中,将数据转成图形数据(可由图形引擎渲染)
Writer:是一种Mapper,可以将数据写入文件或输出流中。
- 管道拓扑:使用方法aFilter->SetInput(anotherFilter->GetOutPut());的不同变体来构成。多输入和多输出时类似。
- 控制管道执行的机制:仅执行必须更新的部分,使用懒惰赋值方法Lazyevaluation(当数据被请求时才求值)。
- 管道组装:必须满足前后两级滤波器的输出与输入兼容。(这对于编译型语言可以在编译时检查,解释型则会到运行时出错)
- 管道执行:决定数据是否缓存或保留。这对于系统性能至关重要。VTK使用引用计数方法确定数据对象的生存期,并提供方法关启数据缓存或截取流数据片段。
|
<--------------------------------Update()方法的方向--------------------------------------------------
Source--->Filter---->Mapper------>Actor<-------------Render()
-------------------------------数据生成方向------------------------------------------->
通常不需手动激活Update()方法:滤波器是嵌入在可视化管道内
其中的Render方法经常用于初始化数据请求
Image Processing
VTK中2D和3D数据都称作vtkImageData。
图像数据对象是一个规则的,轴向组织的数组。
处理对象Process在管道中总是输入和输出图像数据对象。
体绘制使用3D vtkImageData
几乎所有的处理对象在图像管道中都是多线程的,且有能力分段处理流数据(满足用户指定的内存限制)。
滤波器可以自动感知系统中的有效处理器的数目,并在执行过程中创建多线程,以及自动分割数据成片段。
|
User Methods, Observers, and Commands
Callback/User method:在VTK中使用Subject/Observer和Command设计模式。
vtkObject中的每个子类都具有AddObserver()方法,可以用于设置观察者--捕获对象的事件。
在其示例Examples程序中有不同语言的示例。
回调函数:
myCallback:public vtkCommand{
};
通常在Execute中无需处理调用者对象。如用,则可以用类型重塑方法vtkRenderer::SafeDownCast(caller)。
不同语言之间的切换比较直接,因为类名和方法名称都是相同的,不同的只是不同语言的语法。
VTK设计流程:读取、产生数据--过滤--渲染--交互
|
Procedural Source Object:
Reader Source Object:
vtkRenderWindowInteracto
Interactor可以支持同一窗口中的多个渲染器。
默认的按键:
j/t:开关控制joystick(位置)和trackball(移动)
c/a:开关控制camera(相机)和actor(对象)模式
Button1:旋转相机,沿着focal point;或角色actor,沿着其原点
Button2:摇摄相机或平移角色
Button3:缩放相机或角色
3:开关控制场景立体模式。对于配备水晶眼LCD立体眼睛,需要激活SetStereoTypeToCrystalEy
e:退出应用程序
f:设定当前光标位置为焦点focal point
p:执行拾取操作。基于vtkPropPicker对象。
r:沿着当前视向复位相机。将actors移到中心位置,移动相机确保所有角色可见。
s:改变所有角色的表示成surfaces。
u:激活用户自定义的方法。
w:改变所有角色的表示成wireframe。
可以自定义自己的类或者重新覆盖这些默认的行为。
默认行为还具备激活灯源的作用,LightFollowCameraOn()方法使灯源和相机的位置与焦点同步,默认为头灯headlight。
Interactor Styles
两种截然不同的方法控制交互方式。
一、使用vtkInteractorStyle的子类对象。使用vtkRenderWindowInteracto
二、直接管理事件循环。在Linux中可以使用vtkmm与GTKMM合成使用,必须基于gtkglextmm组件。
|
如对于数据缩小滤波器可以使用vtkShrinkPolyData。
其中输入源必须与输出源类型兼容,但即使不兼容,可视化管道也能维持运行。
3D场景中会默认设定相机和灯光。
初始化相机
vtkCamera* cam1 = vtkCamera::New();
cam1->SetClippingRange(0.0475572,2.337786);
cam1->SetFocalPoint(0.052665, -0.129454,-0.0573973);
cam1->SetPosition(0.327637, -0.116299,-0.256418);
cam1->ComputeViewPlaneNormal();
cam1->SetViewUp(-0.0225386, 0.999137,0.034901);
ren1->SetActiveCamera(cam1);
设置已有的相机
cam1 =ren1->GetActiveCamera();
cam1->Zoom(1.4);
另外,也可以使用Dolly()方法沿着视平面法向移动相机,实现放大或缩小可见角色物体。
基于焦点,使用Azimuth()和Elevation()方法设置相机的方位角和高度角/仰角(度,degree)[球坐标系统]。
注意其中在南极和北极存在奇异点,即视向量平行于视平面法向。此时可以使用OrthogonalizeViewUp()方法强制其正交。但这会改变相机坐标系统。
正交投影vs透视投影
vtkCamera::ParallelProjectionOn()开启平行/正交投影。此时需通过SetParallelScale()方法控制角色物体的缩放。Zoom不再有效。
http://shenaodong.blogchina.com/viewdiary.15515438.html
|
常用方法:
SetColor:设置RGB颜色
SetFocalPoint:设置焦点
SetPosition:设置位置
绘制器vtkRender::AddLight()方法加入灯源。
通常来说灯源的焦点和位置设置成相机一样,即头灯。
点光源设置:使用PositionalOn()方法,同时使用SetConeAngle()方法设置其覆盖范围,如设为180则无点源效果。
http://shenaodong.blogchina.com/viewdiary.15515463.html
|
vtkActor是通过几何图元构成的prop,如多边形和直线等。
SetPositon(x, y,z)--设置在世界坐标系中的位置
AddPosition(delaX, deltaY,deltaZ)--平移,沿着各个轴
RotateX(theta),RotateY(theta), RotateZ(theta)--分别沿着三个轴旋转角度,单位为度degree
SetOrientation(x, y,z)--设置方向,先绕z轴旋转,而后是x轴,而后是y轴
AddOrientation(a1, a2,a3)--增加方向量
RotateWXYZ(theta, x, y,z)--沿着给定的(x,y,z)向量旋转theata角度
Scale(sx, sy,sz)--缩放
SetOrigin(x, y,z)--指定prop的原点。该点是作为其旋转和缩放的参考点。
重点是要注意其中的变换顺序,顺序不同结果会不同。在VTK中,其变换顺序是:
先平移到原点--缩放--绕Y轴旋转--绕X轴旋转--绕Z轴旋转--在从原点恢复--平移
来源:http://shenaodong.blogchina.com/viewdiary.15515615.html
|
其返回的内容根据拾取的类型而定,可能是最简单的全局坐标,或者是穴,单元格,点,参数坐标,vtkProp,组装路径等。
拾取语法:Pick(SelectionX,selectionY, selectionZ,Renderer)其中Renderer中的actor都有可能被选择。
通常,selectionZ设置成0.0。当然,典型的用法是不必直接调用上述方法,而是通过vtkRenderWindowInteracto
标签:科学 |
定义几何体:演员的几何形状是由SetMapper()方法确定。如
vtkPolyDataMapper* mapper = vtkPolyDataMapper::New();
mapper->setInput(aFilter->GetOutput());
vtkActor* actor = vtkActor::New();
actor->SetMapper(mapper);
上述的mapper使用分析图元如点,线,多边形和三角面片绘制几何体。mapper是可视化管道的终点,也是可视化管道和图形管道的桥梁。
ACTOR Properties:演员提供vtkProperty的实例,其控制actor的表现、外观。
具体有颜色,表示[点,线框,面],光影模式[平面,Gouraud],透明度[相对透明度],环境,漫反射,镜面反射颜色等。
Actor color:其分量值为[0,1]
可以使用SetColor()直接设定;也可以分别设定环境,漫反射,镜面反射颜色。
注意:颜色设置仅当actor的mapper中没有标量数据时才有效。默认mapper输入标量数据颜色设置actor时,actor的颜色被忽略。
可以通过忽略标量数据ScalarVisibilityOff()方法。
透明度设置:需要考虑渲染顺序。可以使用深度排序滤波器vtkDepthSortPolyData沿着视向将多边形排序。
组装:可以使用vtkAssembly将多个部件组装后形成一个新的整体。AddPart()方法加入新的部分(actor演员)。其中组装体不能设置属性,必须尤其部分设定。
Volumes:vtkVolume用于体绘制。类似于vtkActor。其相关的属性对象类型为vtkVolumeProperty。