日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

vtk体绘制

發布時間:2023/12/14 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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),由于時間關系,我們不能保證每周都能更新本書內容,但盡量做到一周更新一篇到兩篇內容。敬請期待^_^。歡迎轉載,另請轉載時注明本文出處,謝謝合作!同時,由于譯者水平有限,出錯之處在所難免,歡迎指出訂正!】

【本節對應原書中的第139頁至第142頁】

第7章體繪制

體繪制是一種三維空間中而非三維空間中的二維曲面上繪制三維數據的技術。體繪制和幾何繪制并沒有嚴格的界限。兩種技術經常會有相似的結果,有時兩者又可認為是一種技術。例如,利用輪廓提取技術從圖形數據中提取等值面,然后利用幾何渲染技術來繪制等值面,也可以使用光線投射技術,在到達某個值時結束光線追蹤來繪制等值面。這兩種方法產生相似的效果。再比如,基于紋理映射的混合體繪制。該方法的適用數據是圖像,因此可以看做是體繪制,也可以看做是幾何繪制,因為它使用幾何圖元和標準的圖形硬件。

為了根據渲染數據的屬性進行定制,在VTK中兩種渲染技術進行了區分。到目前為止看到的例子中,數據渲染都會用到vtkActor,vtkProperty以及vtkMapper的子類。vtkActor中保存了位置,方向以及縮放等信息,以及Property和mapper指針。vtkProperty中存儲了數據渲染時的表面屬性,例如環境光參數,陰影類型等。vtkMapper則負責數據渲染。對于體繪制,可以使用的類比較多。vtkVolume用來替代vtkActor表示空間對象。類似于vtkActor,vtkVolume中存儲了數據的位置,方向和縮放參數。但是,其內部還有vtkVolumeProperty和vktAbstractVolumeMapper的引用。vtkVolumeProperty中存儲了影像數據實際顯示效果的參數,這些參數不同與幾何繪制的參數。vktAbstractVolumeMapper負責數據體繪制和輸入數據的合法性檢查。

VTK中對于矩形網格數據(vtkImageData)和非規則網格(vtkUnstructuredGrid)都可以進行體繪制。根據具體vktAbstractVolumeMapper子類的SetInput()函數來設置相應的數據指針(vtkImageData或者vtkUnstructuredGrid)。注意,可以將非規則數據進行重采樣為規則數據進行體繪制。(100頁“Probing”)。另外也可以通過四面體化技術來產生非規則網格來進行體繪制。

對于每種支持的數據類型,都有多種不同的體繪制技術可以使用,接下來會進行具體的分析。然后介紹這些技術中都用到的一些對象和參數,詳細分析每種技術細節。最后再討論一下每個方法的效率問題。

7.1 體繪制支持的數據類型發展歷程

VTK最開始僅僅支持的是基于vtkImageData體的繪制方法。vtkVolumeMapper類為這些體繪制方法定義了所有的API函數。后來,基于vtkUnstructuredGrid數據的體繪制方法加入進來。為了保持向前兼容,引入了一個抽象基類作為所有的體繪制方法類的父類。類似地,為vtkVolumeMapper(該類渲染vtkImageData)和vtkUnstructuredGridVolumeMapper(該類負責渲染vtkUnstructuredGrid)引入一個父類vtkAbstractVolumeMapper。

7.2 一個簡單的例子

圖7-1中展示了一個簡單的體繪制效果(參考VTK/Examples/VolumeRendering/Tcl/SimpleRayCast.tcl)。該例子中對vtkImageData采用光線投射方法進行體繪制,代碼中黑體部分是體繪制的相關代碼。從該例可以看出體繪制相關代碼可以使用的其他的mappers進行替換來實現體繪制,主要包括針對vtkImageData的紋理映射方法,針對vtkUnstructuredGrid數據的基于投影的體繪制方法。在當前例子中只需要該很小的改動,因為大多數的功能函數都在基類中定義,因此對于所有的體繪制方法子類是共有的。


圖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定義兩個函數,分別負責將像素映射為不透明度和顏色。然后,定義一個專用于光線投射體繪制方法的vtkVolumeRayCastCompositeFunction對象。該對象負責合成投射光線上的采樣點數據。另外還定義一個vtkVolumeRayCastMapper對象執行基本的光線投射操作,如空間變換和裁剪等。將讀入的圖像作為mappper對象的輸入數據,并創建一個vtkVolume(該類是vtkProp3D的子類,與vtkActor功能類似)對象來粗存儲mapper和property對象。最后,將vtkVolume對象添加至renderer中實現場景渲染。

如果使用二維紋理映射方法來替代光線投射方法,那么黑體部分代碼可以替換為:

vtkVolumeTextureMapper2D volumeMapper

volumeMapper SetInputConnection [ readerGetOutputPort ]

如果顯卡支持三維紋理映射的話,那么上面代碼還可以采用三維紋理映射替換如下:

vtkVolumeTextureMapper3D? volumeMapper

volumeMapper SetInputConnection [ readerGetOutputPort ]

vtkFixedPointRayCastMapper也可以用來替換vtkVolumeRayCastMapper,并且在多數情況下推薦使用該mapper。vtkFixedPointRayCastMapper將所有數據類型都看做為多元數據,并使用定點計算和空間跳躍技術來實現高效計算。然后由于其混合操作采用的是硬編碼,因此難于定制新的光線投射算法,可擴展性較差。上例中用vtkFixedPointRayCastMapper替換如下:

vtkFixedPointRayCastMapper volumeMapper

volumeMapper SetInputConnection [ readerGetOutputPort ]

如果使用非規則數據的體繪制方法進行替換的話,那么替換的代碼就會稍微復雜一些,因為在設置mapper輸入前,需要先將vtkImageData數據轉換為vtkUnstructuredGrid類型數據。下面代碼中使用了非規則網格體繪制技術,通過顯卡將四面體網格數據進行投影。

#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數據。因為針對vtkImageData的mappers無論在時間效率上還是渲染效果上都要優于針對vtkUnstructuredGrid的mappers。


總結

以上是生活随笔為你收集整理的vtk体绘制的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。