第04章-VTK基础(3)

【译者:这个系列教程是以Kitware公司出版的《VTK User’s Guide -11th edition》一书作的中文翻译(出版时间2010年,ISBN: 978-1-930934-23-8),由于时间关系,我们不能保证每周都能更新本书内容,但尽量做到一周更新一篇到两篇内容。敬请期待^_^。欢迎转载,另请转载时注明本文出处,谢谢合作!同时,由于译者水平有限,出错之处在所难免,欢迎指出订正!】


【本小节内容对应原书的第48页至第52页】

4.3Filtering Data

4.1节例子里的管线只由一个Source和Mapper对象组成,管线里没有Filter。这一部分我们会演示如何在管线里增加一个Filter。

Filter的连接可以通过方法SetInputConnection()和GetOutputPort()。例如,我们可以在4.1节例子的基础上,对组成模型的多边形数据(Polygon)做收缩(Shrink)处理,下面列出了部分代码,完整的代码可以在VTK/Examples/Rendering/Tcl/FilterCADPart.tcl里找到。

vtkSTLReaderpart
    part SetFileName"$VTK_DATA_ROOT/Data/42400-IDGH.stl"
vtkShrinkPolyDatashrink
    shrink SetInputConnection [partGetOutputPort]
    shrink SetShrinkFactor 0.85
vtkPolyDataMapperpartMapper
    partMapper SetInputConnection [shrinkGetOutputPort]
vtkLODActorpartActor
    partActor SetMapper partMapper


图4-3 Filtering Data, 这个例子我们使用了收缩Filter(Shrink Filter),将多边形数据沿着模型的中心进行收缩。

正如你所见,创建可视化管线是比较简单的。只要选对正确的类,保证相互连接的Filter的输入和输出的类型匹配,以及设置必要的变量值即可。当管线里的Source或者Filter输出的数据类型与下一个Filter或Mapper的输入类型一致,就说输入和输出的类型是匹配的。输出的数据类型除了要与输入的匹配,还必须与输入的子类的类型匹配。可视化管线可以包含循环,但是一个Filter的输出不能直接地作为它本身的输入。

4.4控制相机

你可能已经注意到,以上所列的例子里,并没有实例化相机或光源对象。如果你对3D图形学比较熟悉的话,就应该知道相机和光源对于要渲染的对象来说是必不可少的。VTK里,如果没有直接地创建相机和光源对象的话,渲染器会自动地创建默认的相机和光源实例。

实例化相机

下面的Tcl脚本演示了如何实例化一个相机对象以及如何把相机与渲染器关联起来。

vtkCameracaml
  cam1 SetClippingRange 0.0475572 2.37786
  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

如果你想访问一个已经存在的相机(比如,渲染器自动创建的相机实例),用Tcl脚本可以写为:

set cam1 [ren1 GetActiveCamera]
$cam1 Zoom 1.4

一起来看一下上面列出的有关相机的方法。SetClippingRange()函数接收两个参数,分别表示沿着视平面法向量的方向,相机与近剪裁平面(ClippingPlane)和远剪裁平面的距离。渲染时,所有位于这两个剪裁平面之外的图形元将会被剪切掉,所以,必须保证所有的你想观察的对象位于这两个剪裁平面之间。FocalPoint和Position变量(在世界坐标系里定义)分别控制相机的方向和位置。ComputeViewPlaneNormal()方法会以当前设置的相机位置和焦点重置视平面的法向量。如果视平面的法向量与视平面不垂直的话,可以得到其他的视觉效果,如错切(Shearing)等。ViewUp变量控置相机“向上”的方向。最后,Zoom()方法是通过改变视角(ViewAngle)(即SetViewAngle()方法)使得物体放大显示。同样,你也可以使用Dolly()方法沿着视平面的法向方向移动相机,或者放大、收缩渲染场景中可见的actor。

简单控制方法

以上介绍的方法并不是常用的控制相机的简便方法。如果相机已经“看着”你想要的那个点,即已经设置了相机的焦点(Focal Point),你可以使用Azimuth()和Elevation()方法绕着焦点旋转相机。

cam1 Azimuth 150
cam1 Elevation 60

Azimuth()方法会在球坐标下以焦点为中心沿着经度方向(Longitude Direction)旋转指定的角度;Elevation()方法则是沿着纬度方向(LatitudeDirection)旋转。这两个方法都不会改变相机的View-up向量。但要注意一点,在球坐标的北极和南极时,View-up向量变成了与视平面法向量平行。如果要避免这种情况,可以调用方法OrthogonalizeViewUp()强制View-up向量与视向量正交。但是这样会改变相机的坐标系统,因此,如果你以水平或者View-up向量的方向绕着某个物体飞行(比如地形图),就数据而言,相机的控制就不再那么自然了。

控制视方向

相机的一个常用的功能是在一个特定的方向生成一个视方向。可以调用SetFocalPoint(),SetPosition()和ComputeViewPlanNormal()方法,紧接着调用渲染器的ResetCamera()方法把该相机设置到渲染器中。

vtkCameracam1
  cam1 SetFocalPoint 0 0 0
  cam1 SetPosition 1 1 1
  cam1 ComputeViewPlaneNormal
  cam1 OrthogonalizeViewUp
ren1 SetActiveCamera cam1
ren1 ResetCamera

相机的初始方向(视向量或视平面法向量)是通过焦点、相机位置及方法ComputeViewPlanNormal()来计算的。你也可以指定一个初始的View-up向量,然后将它与视向量正交而得到初始的方向。ResetCamera()方法可以沿着视向量移动相机,这样,渲染器里所有的Actor都会可见。

透视投影和正交投影

前面的例子,我们都假定相机是透视投影的,即通过相机的视角(View Angle)来控制渲染时Actor在视平面上的投影。透视投影产生更加自然的影像的同时,会引入形变的效果,这在某些应用程序中是不希望得到的效果。正交(或平行)投影是另外一种投影模式。正交投影模式下,视线都是平行的,物体的渲染就没有距离差别的效果。

相机的正交投影模式可以使用方法vtkCamera::ParallelProjectionOn()设置。正交(平行)投影模式下,相机的视角(ViewAngle)就不再控制对象的缩放了,可以用方法SetParallelScale()来代替控制对象的放大与缩小。

保存/恢复相机状态

另外一个应用程序普遍需要的功能是保存和恢复相机状态(也就是重置视图)。要保存相机状态,最起码需要保存剪裁范围、相机焦点、位置和View-up向量,计算视平面向量。然后可以用这些保存的信息实例化一个相机对象,恢复相机的状态,并把相机设置到适当的渲染器中(即SetActiveCamera())。

某些情况下,可能还需要保存其他的信息。比如,如果设置了相机的视角(View Angle) (或ParallelScale),就需要保存这些信息。又或者你把相机用于立体视图,就需要设置及保存EyeAngle和Stereo标志。

4.5控制光照

相对于相机来说,光照的控制要简单一些。使用较多的方法主要有SetPosition(),SetFocalPoint()以及SetColor()。Position和FocalPoint分别控制光照的位置和方向。光照的Color是用RGB值来表示。光照可以通过方法SwitchOn()和SwitchOff()打开和关闭,光照的强度则是用方法SetIntensity()来设置。

缺省的vtkLight实例是方向光照(DirectionLight),也就是说光照的位置和焦点所确定的向量与光照的光线是平行的,光照的位置位于无限远处。这意味着如果光照的焦点和位置做平移变换的话,照射在物体上的光照不会发生变化。

光照与渲染器的关联如下面代码所示。

vtkLightlight
  light SetColor 1 0 0
  light SetFocalPoint [cam1 GetFocalPoint]
  light SetPosition [cam1 GetPosition]
ren1 AddLight light

以上代码创建的是一个红色的前灯光照(Headlight),即光照的位置和焦点与相机的一致。这也是一个非常有用的特技,主要应用于与渲染器交互时,当相机发生移动的时候可以重置光照的位置。

位置光照

用PositionnalOn()方法可以创建位置光照(即聚光灯),这个方法通常与SetConeAngle()方法协同使用,用来控制聚光光照的照射范围。聚光锥角(Cone Angle)等于180度时意味着聚光光照不起作用。


VTK用户指南 版本4.0 William J. Schroeder 1998-2000 第一部分 VTK 介绍 第1 欢迎 机构-----------------------------------------------------------------------------------------------8 怎样使用VTK----------------------------------------------------------------------------------8 附加资源-----------------------------------------------------------------------------------------8 第2 安装 2.1 概述-----------------------------------------------------------------------------------------------9 2.2 安装VTK到Windows9x/NT/ME/2000/XP------------------------------------------------9 二进制安装-------------------------------------------------------------------------------------9 源代码安装-------------------------------------------------------------------------------------9 2.3 安装VTK到Unix操作系统 源代码安装------------------------------------------------------------------------------------10 运行CMake------------------------------------------------------------------------------------11 编译源代码 建立VTK多平台 安装VTK 第3 系统概述 3.1 系统设计---------------------------------------------------------------------------------------12 图形模型--------------------------------------------------------------------------------------13 可视化模型-----------------------------------------------------------------------------------15 3.2 创建一个应用---------------------------------------------------------------------------------19 用户方法、对象和命令--------------------------------------------------------------------19 Tcl----------------------------------------------------------------------------------------------19 C++---------------------------------------------------------------------------------------------20 Java Phthon Visual Basic/COM/ActiveX 3.3 在两种语言间转换 第二部分 通过例子学习VTK 第4 基础 4.1 创建1个简单的模型-------------------------------------------------------------------------24 程序化源对象---------------------------------------------------------------------------------24 读取源对象------------------------------------------------------------------------------------26 4.2 使用VTK交互器-----------------------------------------------------------------------------27 vtk绘制窗口交互器 交互风格 4.3 滤波数据---------------------------------------------------------------------------------------29 4.4 控制相机---------------------------------------------------------------------------------------30 安装相机 简单操作方法 控制视角方向 透视与正交视 保存与恢复相机状态 4.5 控制光线---------------------------------------------------------------------------------------32 位置光 4.6 控制3D道具-----------------------------------------------------------------------------------32 指定vtk道具3D位置 演员 演员的详细级 装配 体 vtk装载3D道具 4.7 作用纹理---------------------------------------------------------------------------------------37 4.8 拾取---------------------------------------------------------------------------------------------38 vtk装配路线 例子 4.9 vtk坐标和坐标系---------------------------------------------------------------------------40 4.10 控制vtk演员2D----------------------------------------------------------------------------41 4.11 注释--------------------------------------------------------------------------------------------41 2D注释 3D注释和vtk跟踪 4.12 特殊绘图类-----------------------------------------------------------------------------------44 尺度棒 X-Y绘制 边界盒轴 标记数据 4.13 变换数据--------------------------------------------------------------------------------------48 高级变换 第5 可视化技术 5.1 可视化VTK数据集vtkDataSet(和子类) -------------------------------------------------50 使用数据属性进行工作 颜色映射 轮廓化 浮雕化 流线图 流线表面 剪裁 融合数据 附加数据 用另外一个尺度给等值面赋颜色 抽取单元格子集 抽取单元格作为多边形数据 5.2 可视化多边形数据---------------------------------------------------------------------------67 手工产生多边形数据 产生表面当量 十比一抽取 平滑网格 粘贴数据 产生纹理坐标 5.3 可视化结构网格-----------------------------------------------------------------------------74 手工产生结构化网格 抽取计算平面 结构网格子样化 5.4 可视化直线网格-----------------------------------------------------------------------------76 手工产生VTK直线网格 抽取计算平面 5.5 可视化非结构网格--------------------------------------------------------------------------77 手工产生VTK非结构网格 抽取部分网格 非结构网格轮廓化 第6 可视化图像和体数据 6.1 VTK结构化点的历史表示-----------------------------------------------------------------80 6.2 手工产生VTK图像数据-------------------------------------------------------------------80 6.3 抽取图像数据子样--------------------------------------------------------------------------81 6.4 基于尺度值的弯曲--------------------------------------------------------------------------83 6.5 图像显示--------------------------------------------------------------------------------------83 图像观察者 图像演员 6.6 图像源-----------------------------------------------------------------------------------------85 2D帆布图像源 3D椭圆体图像源 高斯图像源 网格图像源 噪声图像源 正弦曲线源 6.7 图像处理--------------------------------------------------------------------------------------88 梯度化 高斯平滑 直方图 图像逻辑 重新切片 6.8 体绘制-----------------------------------------------------------------------------------------92 一个简单的例子 为什么会有多种体绘制技术? 产生一个VTK体 使用片层化函数 使用颜色变换函数 在一个体属性中控制颜色和透明度 在一个体属性中控制阴影 产生一个体映射 裁剪一个体 粘贴一个体 对一个体应用3D纹理 控制标准编码 体素光线计算 2D纹理映射 VolumePro绘制硬件 速度和精确度交替使用 使用vtkLODProp3D改善性能 可行性/局限性技术 第7 建立模型 7.1 隐模型----------------------------------------------------------------------------------------114 定义隐函数 对隐函数进行抽样 7.2 挤压-------------------------------------------------------------------------------------------117 7.3 构建表面-------------------------------------------------------------------------------------119 Delaunay三角形化 高斯油彩 无组织点产生表面 第三部分 VTK研发者指南 第8 数据接口和其他 8.1 读入器----------------------------------------------------------------------------------------130 多边形数据读入器 图像和体素读入器 数据集读入器 结构化网格读入器 线性网格读入器 非结构化网格读入器 8.2 写入器----------------------------------------------------------------------------------------131 多边形数据读入器 图像和体素读入器 结构化网格读入器 线性网格读入器 非结构化网格读入器 8.3 输入者----------------------------------------------------------------------------------------132 8.4 输出者----------------------------------------------------------------------------------------132 8.5 创建硬拷贝----------------------------------------------------------------------------------132 保存图像 保存大(高分辨率)图像 8.6 产生动画(使用样条) -----------------------------------------------------------------------134 8.7 使用现场数据工作--------------------------------------------------------------------------136 第9 贡献编码 9.1 编码补偿--------------------------------------------------------------------------------------141 为VTK贡献编码的条件 编码风格 如何贡献编码 9.2 标准方法: 创建和消除对象---------------------------------------------------------------142 9.3 拷贝对象和受保护的方法------------------------------------------------------------------143 9.4 写一个VTK类: 综述-----------------------------------------------------------------------144 找到一个相似类 识别一个超类 单个类Per.h 文件 必需的方法 文档编码 使用SetGet宏 向VTK中添加类 9.5 对象工厂--------------------------------------------------------------------------------------145 综述 如何写一个工厂 如何安装一个工厂 例子工厂 第10 流水线执行管理 10.1 执行过程--------------------------------------------------------------------------------------151 概述和术语 更新信息通道 传播更新扩展通道 触发异步更新通道 更新数据通道 10.2 使用流---------------------------------------------------------------------------------------162 第11 VTK数据对象接口 11.1 数据组---------------------------------------------------------------------------------------166 方法 11.2 数据集---------------------------------------------------------------------------------------169 11.3 VTK数据集接口---------------------------------------------------------------------------170 方法 例子 11.4 VTK图像数据接口-----------------------------------------------------------------------174 方法 例子 11.5 VTK点集接口-----------------------------------------------------------------------------176 方法 例子 11.6 VTK结构化网格接口---------------------------------------------------------------------178 方法 例子 11.7 VTK线性网格接口-----------------------------------------------------------------------178 方法 例子 11.8 VTK多边形数据接口---------------------------------------------------------------------179 方法 例子 11.9 VTK非结构化网格接口-----------------------------------------------------------------184 方法 例子 11.10 单元格接口(VTK单元格子类) ------------------------------------------------------185 11.11 其他接口----------------------------------------------------------------------------------187 点 单元格数组 单元格类型 单元格连接 11.12 现场和属性数据接口------------------------------------------------------------------193 现场数据方法 数据集属性方法 第12 如何写一个过程方法 12.1 概述----------------------------------------------------------------------------------------196 永远不要修改输入数据 参考计数数据 使用Debug宏 回收/删除截入的内在 修改时间 过程事件和异常终止执行 12.2 如何写一个绘图过滤器---------------------------------------------------------------199 概述 简单过滤器 复杂过滤器和流水线执行 抽取绘图过滤器 程序过滤器 重载流水执行方法 12.3 如何写一个图像过滤器---------------------------------------------------------------210 实现一个图像过滤器 第13 用窗口系统集成 13.1 绘制窗口交互风格--------------------------------------------------------------------------216 13.2 GUI交互的总指导线------------------------------------------------------------------------217 13.3 X Window, Xt, and Motif--------------------------------------------------------------------221 13.4 MS Windows/Microsoft Foundation Classes---------------------------------------------226 13.5 Tcl/Tk-------------------------------------------------------------------------------------------227 13.6 Java 第14 编码资源 14.1 对象图表--------------------------------------------------------------------------------------230 基础 单元格 数据集 流水线 源 过滤器 映射器 图形 体绘制 成像 OpenGL绘制器 拾取 变换塔形结构 14.2 过滤器总结-----------------------------------------------------------------------------------237 可视化过滤器 映射者对象 演员对象 14.3 VTK文件格式--------------------------------------------------------------------------------244 二进制文件 数据集属性格式 例子 第15 光盘 15.1 源代码 15.2 例子代码 15.3 Window 9x/NT/ME/2000/XP 预编译二进制 15.4 数据 15.5 文档 15.6 退化测试图像 15.7 Kitware 应用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值