MITK中的渲染

2021-06-29 12:39:19 字數 2444 閱讀 2431

mitk的渲染管道繼承自vtk的渲染管道

vtk渲染管道

在vtk中,vtkrenderwindow協調渲染過程。多個vtkrenderer可能被關聯到乙個vtkrenderwindow。所有能夠存在於乙個渲染場景(2d或3d)中的可見物體,都繼承自vtkprop(或其子類vtkactor)。vtkpropassembly是多個vtkprop的集合,看起來像是乙個vtkprop。

mitk使用新的介面類,vtkmitkrenderprop,同樣繼承自vtkprop。同vtkpropassembly一樣,所有的mitk渲染工作都通過這個介面類進行。所以,mitk的渲染過程被完全融入vtk的渲染管道。從vtk的角度看,mitk的renders就像是自定義的vtkprop。

mitk渲染管道

這個過程與vtk緊密相關。我們使用vtkmitkrenderprop,協同mitk::vtkproprenderer 共同保證與vtk渲染管道的整合。qmitkrenderwindow沒有繼承 mitk::renderwindow,而是繼承自vtk的qvtkwidget

mitk渲染過程中最重要的幾個類如下所示:

向vtkrenderwindow傳送的乙個render請求並不僅僅更新vtk的管道,同樣也更新mitk管道。但是,mitk::renderingmanager仍然協調渲染過程中的更新行為。更新請求應該被送給renderingmanager,如有需要,renderingmanager會請求更新所有的vtkrenderwindow。vtkrenderwindow然後呼叫它關聯著的所有vtkrenderer的render()函式。

sequence diagram for mitk vtk rendering

sequence diagram for mitk opengl rendering

使用者指導:關於渲染的程式設計提示

注意

大多數情況下並不需要用到forceimmediateupdateall()

個別渲染管道的建立有時,我們需要某個(或多個)qmitkrenderwindow的管理不同於「通常」的qmitkstdmultiwidget中定義的renderwindow。這可能涉及到被渲染的資料以及可能的互動。為達成這個目的,我們需要一組物件:

這幾個類的設定和關聯十分簡單:

// create a new instance of mitk::renderingmanager

mitk::renderingmanager

::pointer renderingmanager = mitk::renderingmanager

::new();

// create new instances of datastorage and globalinteraction

mitk::datastorage

::pointer datastorage = mitk::datastorage

::new();

mitk::globalinteraction

::pointer globalinteraction = mitk::globalinteraction

::new();

// add both to the renderingmanager

renderingmanager->setdatastorage( datastorage );

renderingmanager->setglobalinteraction( globalinteraction );

// now create a new qmitkrenderwindow with this renderingmanager as parameter

qmitkrenderwindow* renderwindow =

new qmitkrenderwindow( parent, "name", renderer, renderingmanager );

這就是建立自己的渲染管道所需的全部內容。顯然,你需要將所有想渲染的資料加入到新的datastorage中。如果你想跟這個renderwindow互動,還需要新增interactors/listeners。

注意

應避免將mitk::baserenderer dynamic cast到openglrenderer(或vtkproprenderer)。」mitk scene」 vtkrenderer和vtkrenderwindow 也包含到了mitk::baserenderer中。

重寫getvtkprop(),它應該返回generatedataforrender() 中生成的具體vtkprop(單個actor或者多個actor的組合–propassembly)。

在自定義外掛程式中建立MITK類

mtik自帶的類對我們很有借鑑意義,編寫自己的外掛程式時,如果想改寫mitk自帶的類,那麼最好不要在源 中更改,而是自己新建乙個類,將mitk自帶的類移植過來。這個方法同樣適用於想在命名空間mitk中新增自定義類。下面看乙個例子。mitk中自帶的mitkpointsetdatainteractor....

MITK 在原始檔中引用自定義標頭檔案

mitk程式設計中,我們常常需要自定義標頭檔案,比如在vs工程裡面給外掛程式addnoise建立乙個標頭檔案testheadfile.h 正確的做法是 將testheadfile.h複製到原始檔 mitk projecttemplate plugins my.awesomeproject.addno...

Vue 中的列表渲染

let vm new vue 上面是乙個最基礎的列表渲染,在實際開發中,還有很多細節點,為了提公升迴圈的效能,會給迴圈項加乙個唯一的key值。我們可以用index作為唯一的key值。其實不推薦大家這樣使用index的,因為這樣使用index作為key值,在你頻繁操作dom元素時,會比較費效能,無法充...