【可視化】VTKのレイヤー構造とセットトップ表示

1221 ワード

VTKを振り回す前にOpenGLを使ってボディペイントをしていました.ボリュームペイントモデルに隠されずにフェースモデルを常に表示するには、z-bufferをキャンセルし、深さ機能を有効にしないで、ボリュームモデルを先に描画してからフェースモデルを描画し、フェースモデルが常に表示ボディモデルを上書きするようにします.OpenGLに比べてVTKは複雑なモデルをより簡単に描くことができ、可視化機能の拡張に役立ちます.私がVTKで出会った問題は、フェースモデルが常にボリュームペイントモデルに埋め込まれ、ペイント効果がBlendモードに似ていることです.客観的真実に合致する描画結果ですが、面モデルを優先的に表示する必要があります.VTKが深度機能を断固としてキャンセルすると、奇妙な描画結果が表示されます.私が望む機能を実現するために、VTKの描画階層を考えました.VTK-QTバージョンでは、VTKの最上位レベルがqvtkwidgetクラスであり、内部にvtkRenderWindowが含まれています.vtkRenderWindowでは、実際の描画レンダリングを制御するためにvtkRendererを追加する必要があります.ペイントする必要があるすべてのオブジェクトデータと属性は、vtkActorと同じレベルの派生オブジェクトに配置され、vtkRendererペイントに割り当てられます.vtkCameraは、ユーザインタラクションのためにvtkRendererに割り当てられる.1つのvtkRenderWindowに複数のvtkRendererがあることが問題の突破口である.ほとんどの例vtkRenderWindowにはvtkRendererが1つしか追加されていません.vtkRendererを追加する関数接頭辞はsetではなくaddであることを見ました.これは、複数のvtkRendererを制御することができることを示しています.複数のvtkRendererを追加できる以上、vtkRenderWindowには管理メカニズムがあるはずです.(c++)
volumeRenderer_->SetLayer(0);
tagRenderer_->SetLayer(1);
GetRenderWindow()->SetNumberOfLayers(2);
GetRenderWindow()->AddRenderer(tagRenderer_);
GetRenderWindow()->AddRenderer(volumeRenderer_);
ペイントボディでペイントされたvtkRendererが0層目、ペイントフェースモデルが1層目であれば、フェースモデルは次の層を表示するボリュームペイントを上書きします.問題解決