1. 程式人生 > >第04章-VTK基礎(3)

第04章-VTK基礎(3)

.net http tput 作用 lte osi amp 組成 演示

【譯者:這個系列教程是以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)