vtk体绘制
轉載自http://blog.csdn.net/www_doling_net/article/details/37906475
【譯者:這個系列教程是以Kitware公司出版的《VTK User’s Guide -11th edition》一書作的中文翻譯(出版時間2010年,ISBN: 978-1-930934-23-8),由于時間關系,我們不能保證每周都能更新本書內容,但盡量做到一周更新一篇到兩篇內容。敬請期待^_^。歡迎轉載,另請轉載時注明本文出處,謝謝合作!同時,由于譯者水平有限,出錯之處在所難免,歡迎指出訂正!】
【本節(jié)對應原書中的第139頁至第142頁】
第7章體繪制
體繪制是一種三維空間中而非三維空間中的二維曲面上繪制三維數(shù)據(jù)的技術。體繪制和幾何繪制并沒有嚴格的界限。兩種技術經常會有相似的結果,有時兩者又可認為是一種技術。例如,利用輪廓提取技術從圖形數(shù)據(jù)中提取等值面,然后利用幾何渲染技術來繪制等值面,也可以使用光線投射技術,在到達某個值時結束光線追蹤來繪制等值面。這兩種方法產生相似的效果。再比如,基于紋理映射的混合體繪制。該方法的適用數(shù)據(jù)是圖像,因此可以看做是體繪制,也可以看做是幾何繪制,因為它使用幾何圖元和標準的圖形硬件。
為了根據(jù)渲染數(shù)據(jù)的屬性進行定制,在VTK中兩種渲染技術進行了區(qū)分。到目前為止看到的例子中,數(shù)據(jù)渲染都會用到vtkActor,vtkProperty以及vtkMapper的子類。vtkActor中保存了位置,方向以及縮放等信息,以及Property和mapper指針。vtkProperty中存儲了數(shù)據(jù)渲染時的表面屬性,例如環(huán)境光參數(shù),陰影類型等。vtkMapper則負責數(shù)據(jù)渲染。對于體繪制,可以使用的類比較多。vtkVolume用來替代vtkActor表示空間對象。類似于vtkActor,vtkVolume中存儲了數(shù)據(jù)的位置,方向和縮放參數(shù)。但是,其內部還有vtkVolumeProperty和vktAbstractVolumeMapper的引用。vtkVolumeProperty中存儲了影像數(shù)據(jù)實際顯示效果的參數(shù),這些參數(shù)不同與幾何繪制的參數(shù)。vktAbstractVolumeMapper負責數(shù)據(jù)體繪制和輸入數(shù)據(jù)的合法性檢查。
VTK中對于矩形網格數(shù)據(jù)(vtkImageData)和非規(guī)則網格(vtkUnstructuredGrid)都可以進行體繪制。根據(jù)具體vktAbstractVolumeMapper子類的SetInput()函數(shù)來設置相應的數(shù)據(jù)指針(vtkImageData或者vtkUnstructuredGrid)。注意,可以將非規(guī)則數(shù)據(jù)進行重采樣為規(guī)則數(shù)據(jù)進行體繪制。(100頁“Probing”)。另外也可以通過四面體化技術來產生非規(guī)則網格來進行體繪制。
對于每種支持的數(shù)據(jù)類型,都有多種不同的體繪制技術可以使用,接下來會進行具體的分析。然后介紹這些技術中都用到的一些對象和參數(shù),詳細分析每種技術細節(jié)。最后再討論一下每個方法的效率問題。
7.1 體繪制支持的數(shù)據(jù)類型發(fā)展歷程
VTK最開始僅僅支持的是基于vtkImageData體的繪制方法。vtkVolumeMapper類為這些體繪制方法定義了所有的API函數(shù)。后來,基于vtkUnstructuredGrid數(shù)據(jù)的體繪制方法加入進來。為了保持向前兼容,引入了一個抽象基類作為所有的體繪制方法類的父類。類似地,為vtkVolumeMapper(該類渲染vtkImageData)和vtkUnstructuredGridVolumeMapper(該類負責渲染vtkUnstructuredGrid)引入一個父類vtkAbstractVolumeMapper。
7.2 一個簡單的例子
圖7-1中展示了一個簡單的體繪制效果(參考VTK/Examples/VolumeRendering/Tcl/SimpleRayCast.tcl)。該例子中對vtkImageData采用光線投射方法進行體繪制,代碼中黑體部分是體繪制的相關代碼。從該例可以看出體繪制相關代碼可以使用的其他的mappers進行替換來實現(xiàn)體繪制,主要包括針對vtkImageData的紋理映射方法,針對vtkUnstructuredGrid數(shù)據(jù)的基于投影的體繪制方法。在當前例子中只需要該很小的改動,因為大多數(shù)的功能函數(shù)都在基類中定義,因此對于所有的體繪制方法子類是共有的。
圖7-1 體繪制
# Create the reader for the data
vtkStructuredPointsReader reader
reader SetFileName”$VTK_DATA_ROOT/Data/ironProt.vtk”
?
# Create transfer mapping scalar value to opacity
vtkPiecewiseFunction opacityTransferFunction
? ??opacityTransferFunction AddPoint? 20??0.0
opacityTransferFunction AddPoint? 255?0.2
?
# Create transfer mapping scalar value to color
vtkColorTransferFunction colorTransferFunction
???colorTransferFunction AddRGBPoint?????0.0 0.0 0.0 0.0
??? colorTransferFunctionAddRGBPoint???? 64.0 1.0 0.0 0.0
???colorTransferFunction AddRGBPoint???128.0 0.0 0.0 1.0
???colorTransferFunction AddRGBPoint???192.0 0.0 1.0 0.0
colorTransferFunction AddRGBPoint??? 255.0 0.0 0.2 0.0
?
# The property describes how the data will look
vtkVolumeProperty volumeProperty
???volumeProperty SetColor colorTransferFunction
???volumeProperty SetScalarOpacity opacityTransferFunction
???volumeProperty ShadeOn
volumeProperty SetInterpolationTypeToLinear
?
# The mapper / ray cast function know how to renderthe data
vtkVolumeRayCastCompositeFunction? compositeFunction
vtkVolumeRayCastMapper volumeMapper
???volumeMapper SetVolumeRayCastFunction compositeFunction
volumeMapper SetInputConnection [readerGetOutputPort]
?
# The volume holds the mapper and the property and
# can be used to position/orient the volume
vtkVolume volume
??? volumeSetMapper volumeMapper
volume SetProperty volumeProperty
?
ren1 AddVolume volume
renWin Render
?
首先從硬盤上讀取一個圖像,接著為vtkVolumeProperty定義兩個函數(shù),分別負責將像素映射為不透明度和顏色。然后,定義一個專用于光線投射體繪制方法的vtkVolumeRayCastCompositeFunction對象。該對象負責合成投射光線上的采樣點數(shù)據(jù)。另外還定義一個vtkVolumeRayCastMapper對象執(zhí)行基本的光線投射操作,如空間變換和裁剪等。將讀入的圖像作為mappper對象的輸入數(shù)據(jù),并創(chuàng)建一個vtkVolume(該類是vtkProp3D的子類,與vtkActor功能類似)對象來粗存儲mapper和property對象。最后,將vtkVolume對象添加至renderer中實現(xiàn)場景渲染。
如果使用二維紋理映射方法來替代光線投射方法,那么黑體部分代碼可以替換為:
vtkVolumeTextureMapper2D volumeMapper
volumeMapper SetInputConnection [ readerGetOutputPort ]
如果顯卡支持三維紋理映射的話,那么上面代碼還可以采用三維紋理映射替換如下:
vtkVolumeTextureMapper3D? volumeMapper
volumeMapper SetInputConnection [ readerGetOutputPort ]
vtkFixedPointRayCastMapper也可以用來替換vtkVolumeRayCastMapper,并且在多數(shù)情況下推薦使用該mapper。vtkFixedPointRayCastMapper將所有數(shù)據(jù)類型都看做為多元數(shù)據(jù),并使用定點計算和空間跳躍技術來實現(xiàn)高效計算。然后由于其混合操作采用的是硬編碼,因此難于定制新的光線投射算法,可擴展性較差。上例中用vtkFixedPointRayCastMapper替換如下:
vtkFixedPointRayCastMapper volumeMapper
volumeMapper SetInputConnection [ readerGetOutputPort ]
如果使用非規(guī)則數(shù)據(jù)的體繪制方法進行替換的話,那么替換的代碼就會稍微復雜一些,因為在設置mapper輸入前,需要先將vtkImageData數(shù)據(jù)轉換為vtkUnstructuredGrid類型數(shù)據(jù)。下面代碼中使用了非規(guī)則網格體繪制技術,通過顯卡將四面體網格數(shù)據(jù)進行投影。
#convert data to unstructured grid
vtkDataSetTriangleFilter tetraFilter
tetraFilter SetInputConnection [ readerGetOutputPort ]
?
#creates the objects specific to the projectedtetrahedral method
vtkProjectedTetrahedraMapper volumeMapper
volumeMapper SetInputConnection [ tetraFilter GetOutputPort]
需要注意的是,不推薦將vtkImageData轉換為vtkUnstructuredGrid數(shù)據(jù)。因為針對vtkImageData的mappers無論在時間效率上還是渲染效果上都要優(yōu)于針對vtkUnstructuredGrid的mappers。
總結
- 上一篇: 医院建网站需要多少钱?
- 下一篇: 【入门】小明的幸运数