【译者:这个系列教程是以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度时意味着聚光光照不起作用。

第04章-VTK基础(3)的更多相关文章

  1. 第04章-VTK基础(7)

    [译者:这个系列教程是以Kitware公司出版的<VTK User's Guide -11th edition>一书作的中文翻译(出版时间2010年.ISBN: 978-1-930934- ...

  2. 第04章-VTK基础(4)

    [译者:这个系列教程是以Kitware公司出版的<VTK User's Guide -11th edition>一书作的中文翻译(出版时间2010年,ISBN: 978-1-930934- ...

  3. 第04章-VTK基础(2)

    [译者:这个系列教程是以Kitware公司出版的<VTK User's Guide -11th edition>一书作的中文翻译(出版时间2010年,ISBN: 978-1-930934- ...

  4. python数据分析---第04章 NumPy基础:数组和矢量计算

    NumPy(Numerical Python的简称)是Python数值计算最重要的基础包.大多数提供科学计算的包都是用NumPy的数组作为构建基础. NumPy的部分功能如下: ndarray,一个具 ...

  5. 【学习笔记】 第04章 NumPy基础:数组和矢量计算

    前言 正式开始学习Numpy,参考用书是<用Python进行数据清洗>,计划本周五之前把本书读完,关键代码全部实现一遍 NumPy基础:数组和矢量计算 按照书中所示,要搞明白具体的性能差距 ...

  6. &lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第04章 | 字典

    第04章:字典 当索引不好用时 Python唯一的内建的映射类型,无序,但都存储在一个特定的键中.键能够使字符.数字.或者是元祖. ------ 字典使用: 表征游戏棋盘的状态,每一个键都是由坐标值组 ...

  7. 《Python学习手册 第五版》 -第16章 函数基础

    前面的章节讲解的是一些基础数据类型.基本语句使用和一些文档查看的内容,这些都是一些基础,其实还谈不上入门,只有了解了函数,才算入门 函数是编程里面使用最多的也是最基本的程序结构, 本章重点内容 1.函 ...

  8. 异步编程系列第04章 编写Async方法

    p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提 ...

  9. 《利用python进行数据分析》读书笔记--第四章 numpy基础:数组和矢量计算

    http://www.cnblogs.com/batteryhp/p/5000104.html 第四章 Numpy基础:数组和矢量计算 第一部分:numpy的ndarray:一种多维数组对象 实话说, ...

随机推荐

  1. Linux服务器的弱口令检测及端口扫描

    一.弱口令检测--John the Ripper John the Ripper工具可以帮助我们扫描出系统中密码安全性较低的用户,并将扫描后的结果显示出来. 1.安装John the Ripper: ...

  2. django第七天(模板的复用性,include标签和母版)

    django第7天模板 include标签 模板的共用 a 模板需要到使用到 登陆界面 b 模板需要使用到 登陆界面 可以把登陆界面提取到公共的模板c 为什么要用: 都需要使用相同的界面,减少代码冗余 ...

  3. ACM Changchun 2015 A. Too Rich

    You are a rich person, and you think your wallet is too heavy and full now. So you want to give me s ...

  4. Ubuntu 16.04上thunderbird配置163邮箱出现“配置无法被验证-请查看用户名或密码是否正确?”

    在Ubuntu 16.04 上用thunderbird配置163免费邮箱时出现的提示信息如图1: 图1 提示信息 网上有不少方法都说是将接收和发出的主机名分别改为 imap.ym.163.com 和 ...

  5. vuex相关知识点

    vuex简单理解转载博客 vuex从入门到入门------state:从 store 实例中读取状态最简单的方法就是在计算属性中返回某个状态------Getters:可以很容易地在任何组件中使用它- ...

  6. python知识点拾遗

    内容概要 1.__str__ 2.os.path相关方法 1.__str__ 我们先定义一个Student类,打印一个实例: class Student(object): def __init__(s ...

  7. IOS 自动布局-UIStackPanel和UIGridPanel(四)

    为什么说scrollview的自动化布局是难点? 对scrollview做自动化布局,无非就是想对scrollview里面的subviews来做自动化布局.但是scrollview里面的subview ...

  8. 04-offsetLeft和style.left的区别

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  9. 【组合数+Lucas定理模板】HDU 3037 Saving

    acm.hdu.edu.cn/showproblem.php?pid=3037 [题意] m个松果,n棵树 求把最多m个松果分配到最多n棵树的方案数 方案数有可能很大,模素数p 1 <= n, ...

  10. 【java小工具】从.java文件中筛选出方法,并计算出方法在这些文件中出现的次数

    package getMethod; import java.io.*; import java.util.*; import java.util.regex.Matcher; import java ...