基于VTK User Guide和VTK Textbook学习
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--vtkScalarsToColors的子类
vtkRender
vtkRenderWindow
vtkRenderWindowInteractor
可以通过对上述对象的组合形成场景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。
场景交互可以通过vtkRenderWindowInteractor对象完成。操作相机,拾取物体,激活用户定义的方法,进入或退出透视投影以及设置actors的某些属性。
上述描述的类通常都有特殊行为的子类,如vtkAssembly,vtkFollower,vtkLODActor均是vtkActor的子类。vtkAssembly允许层次式组织actors;vtkFollwer是一个总是面向指定相机的actor,尤其对于文本和广告显示是十分有用的;vtkLODActor是允许改变角色actors的几何表示的actor
图像数据ImageData:vtkImageData
矩阵线性数据RectilinearGrid:vtkRectilinearGrid,其数据组织形式是行列方向线性增长
结构化数据vtkStructuredGrid,无结构化数据点,多边形数据vtkPolyData,无结构化栅格数据vtkUnstructuredGrid
VTK使用数据流的形式转换,其中涉及两个基本对象:vtkDataObject和vtkProcessObject。
DataObject数据对象:
表示不同类型的数据。数据的组织形式由vtkDataSet对象表示。由几何和拓扑结构(点和穴)组成。
DataSet数据集:图像数据ImageData:vtkImageData
矩阵线性数据Rectilinear Grid:vtkRectilinearGrid,其数据组织形式是行列方向线性增长
结构化数据vtkStructuredGrid,无结构化数据点,多边形数据vtkPolyData,无结构化栅格数据vtkUnstructuredGrid
属性数据:单个数据Scalar,3D方向和幅度Vector:(u, v,w);3D方向Normal:(nx, ny, nz), |n|=1,n维索引数据到文理的映射TextureCoordinate,n*n矩阵Tensor,阵列数据vtkFieldArray,其中每一列可以是不同类型的数据。
Cell:是点的拓扑组织,构成数据集的基本形式,用作点之间的插值信息。
处理对象vtkProcessObject:也称作过滤器,滤波器,将已有数据处理形成新的数据。代表了系统所用的算法。Process和数据对象连接在一起形成可视化管道,即数据流网络。
-------- -------- --------- --------
|Source | |Filter | |Filter N | |Mapper |
| |--- | |--- | |---| |---------Graphics Interface
|DataObject | |Data Ojbect | |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{
static myCallback *New() {return new myCallback;}
virtual void Execute(vtkObject *caller, unsigned long, void*callData){ cerr << "Starting toRender...n";}
};
通常在Execute中无需处理调用者对象。如用,则可以用类型重塑方法vtkRenderer::SafeDownCast(caller)。
不同语言之间的切换比较直接,因为类名和方法名称都是相同的,不同的只是不同语言的语法。
VTK设计流程:读取、产生数据--过滤--渲染--交互
Procedural Source Object:
Reader Source Object:
vtkRenderWindowInteractor:控制相机camera和角色actor;两种交互模式:位置joystick和移动trackball。
Interactor可以支持同一窗口中的多个渲染器。
默认的按键:
j/t:开关控制joystick(位置)和trackball(移动)
c/a:开关控制camera(相机)和actor(对象)模式
Button1:旋转相机,沿着focal point;或角色actor,沿着其原点
Button2:摇摄相机或平移角色
Button3:缩放相机或角色
3:开关控制场景立体模式。对于配备水晶眼LCD立体眼睛,需要激活SetStereoTypeToCrystalEyes()
e:退出应用程序
f:设定当前光标位置为焦点focal point
p:执行拾取操作。基于vtkPropPicker对象。
r:沿着当前视向复位相机。将actors移到中心位置,移动相机确保所有角色可见。
s:改变所有角色的表示成surfaces。
u:激活用户自定义的方法。
w:改变所有角色的表示成wireframe。
可以自定义自己的类或者重新覆盖这些默认的行为。
默认行为还具备激活灯源的作用,LightFollowCameraOn()方法使灯源和相机的位置与焦点同步,默认为头灯headlight。
Interactor Styles
两种截然不同的方法控制交互方式。
一、使用vtkInteractorStyle的子类对象。使用vtkRenderWindowInteractor::SetInteractorSytle(vtkInteractorSytleFlight::New())
二、直接管理事件循环。在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); //放大相机,通过改变视角(SetViewAngle()),
另外,也可以使用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。当然,典型的用法是不必直接调用上述方法,而是通过vtkRenderWindowInteractor管理拾取操作。
标签:科学 |
定义几何体:演员的几何形状是由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。
基于VTK User Guide和VTK Textbook学习相关推荐
- VTK教程系列:VTK基础及应用开发教程
由于OpenCV不能使用,只能使用VTK库的图像处理库,暂时还没有找到其他可以全面替代的库: CSDN东灵工作室:http://blog.csdn.net/www_doling_net/article ...
- 《基于张量网络的机器学习入门》学习笔记7
<基于张量网络的机器学习入门>学习笔记7 量子算法 什么是量子算法 三个经典量子算法 Grover算法 背景 基本原理 例题 量子算法 什么是量子算法 例如我们求解一个问题,一个111千克 ...
- 《基于张量网络的机器学习入门》学习笔记6
<基于张量网络的机器学习入门>学习笔记6 密度算符(密度矩阵) 具体到坐标表象 在纯态上 在混合态上 纯态下的密度算符 混合态下的密度算符 密度算符的性质 量子力学性质的密度算符描述 第一 ...
- 《基于张量网络的机器学习入门》学习笔记5
<基于张量网络的机器学习入门>学习笔记5 量子概率体系 事件 互斥事件 概率与测量 不相容属性对 相容属性对 量子概率与经典概率的区别 量子测量 量子概率体系 我们将经典的实数概率扩展到复 ...
- 《基于张量网络的机器学习入门》学习笔记4
<基于张量网络的机器学习入门>学习笔记4 量子概率 将概率复数化 分布与向量的表示 事件与Hilbert空间 不兼容属性及其复数概率表示 为什么一定要复数概率 量子概率 将概率复数化 在经 ...
- 图形处理(十三)基于可变形模板的三维人脸重建-学习笔记
基于可变形模板的三维人脸重建-学习笔记 原文地址:http://blog.csdn.net/hjimce/article/details/50331423 作者:hjimce 一.数据库处理: 我们通 ...
- 基于Anaconda安装GPU版PyTorch深度学习开发环境
基于Anaconda安装GPU版PyTorch深度学习开发环境 1 安装Anaconda 2 安装GPU计算驱动 2.1 检查是否有合适的GPU 2.2 下载CUDA和cuDNN 2.3 安装CUDA ...
- 基于.NET下的人工智能|利用ICSharpCore搭建基于.NET Core的机器学习和深度学习的本地开发环境...
每个人都习惯使用Python去完成机器学习和深度学习的工作,但是对于习惯于某种特定语言的人来说,转型不是那么容易的事.这两年我花了不少时间在Python,毕竟工作的重心也从移动开发转为机器学习和深度学 ...
- 利用ICSharpCore搭建基于.NET Core的机器学习和深度学习的本地开发环境
每个人都习惯使用Python去完成机器学习和深度学习的工作,但是对于习惯于某种特定语言的人来说,转型不是那么容易的事.这两年我花了不少时间在Python,毕竟工作的重心也从移动开发转为机器学习和深度学 ...
最新文章
- oracle 管道化表函数(Pipelined Table) [转]
- 04 Websocket和Websocketed
- 手把手教你C语言静态库的开发
- ob服务器维修视频,教你如何使用OB系统 还在看转播?你OUT了!
- CH - 0802 占卜DIY(简单模拟,水题)
- 【设计模式 06】原型模式(克隆??)
- 黑马商城项目源代码_Python学习路线图--Python框架与项目
- 海底捞员工:假笑到脸僵,撑到经理月入20万
- 前端框架 Bootstrap 5.0 alpha 发布
- 无法连接到WMI提供程序。你没有权限或者该服务器无访问
- 企业级NFS网络文件共享服务
- Adaptive AutoSAR第四版发布大规模应用
- matlab生成vcf,从VCF文件中提取样本数据
- 数据从网卡到应用的过程
- 如何让电脑计算机d盘布局,创建MSR分区,解决“由于用户电脑存在一个不支持的用于UEFI固件的硬盘布局,因此系统无法安装”...
- SpringMVC学习-helloSpringMVC
- 人员离职it检查_经典的it公司员工离职报告范文
- 打印 上一主题 下一主题 简单讲解UEFI及MBR,及UEFI系统安装引导修复
- EasyRecovery 15 mac中文免费密钥数据恢复 安装软件的方法教程及版本对比
- 前端面试题精选(3)