首页 > 代码库 > 第04章-VTK基础(3)
第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度时意味着聚光光照不起作用。
第04章-VTK基础(3)